1.栈回溯的原理 2.修改RT-Thread打印栈内容 3.手工分析栈,找出函数调用关系 4.使用RT-Thread的cm-backtrace
RT-Thread中Lan8720和lwip协议栈的使用 开发环境:野火的stm32f407,rt-threadstudio版本是版本: 2.2.6,stm32f4的资源包为0.2.2,Agile Modbus软件包版本为v1.1.2。新建选择芯片工程。 修改工程使用外部晶振,可参考第一篇文章 rt-thread studio新建stm32f407工程 。 查看野火工程的资料,可知道芯片的使用引脚为: P...
在RT-Thread中使用栈帧来调试程序.pdf,在RT-Thread 中使用栈帧来调试程序 内容: 1. 栈回溯的原理 2. 修改RT-Thread打印栈内容 3. 示例:手工分析栈,找出函数调用关系 4. 使用RT-Thread 的cm_backtrace 1.栈回溯的原理 调试程序时,经常发生这类错误: 1. 读写某个地址,导
thread->stack_size = (rt_uint16_t)stack_size; /** 初始化线程的栈 */ rt_memset(thread->stack_addr, '#', thread->stack_size); thread->sp = (void *)rt_hw_stack_init(thread->entry, thread->parameter, (void *)((char *)thread->stack_addr + thread->stack_size - 4), (void *...
我们以动态线程的栈为例子。 动态线程初始化栈的过程,在 _rt_thread_init() 里面的 rt_hw_stack_init()实现。 #ifdefARCH_CPU_STACK_GROWS_UPWARDthread->sp=(void*)rt_hw_stack_init(thread->entry,thread->parameter,(void*)((char*)thread->stack_addr),(void*)rt_thread_exit);#elsethread->sp=...
每一个线程在初始化的时候,需要分配栈空间 rt_thread_create/rt_thread_init --> _rt_thread_init --> rt_hw_stack_init 最后调用到了/libcpu/arm/cortex-a/stack.c文件。 代码语言:javascript 复制 rt_uint8_t*rt_hw_stack_init(void*tentry,void*parameter,rt_uint8_t*stack_addr,void*texit){rt...
void (*cleanup)(struct rt_thread *tid); /**< 线程退出时的清除函数 */ rt_uint32_t user_data; /**< 私有用户数据 */ }; 总的来看,线程皆有由几类成员组成:object,栈相关信息,优先级信息,事件,定时器信息,私有数据指针。在RT-Thread中提供的线程接口函数都是围绕线程的各种状态展开的。
1.使用三个线程,内部调用延时函数,每个线程内部延时1s。 2.使用系统自带的钩子函数,在调度器实现调度的时候打印线程状态和名称。 3.使用系统自带的调试函数,打印出 to thread 和 from thread 的名称与优先级以及remove thread 和 insert thread。 主要代码如下 ...
按下Tab 键后打印出来的当前支持的所有显示 RT-Thread 内核状态信息的命令。 2.2、显示线程状态 使用ps 或者 list_thread 命令来列出系统中的所有线程信息,包括线程优先级、状态、栈的最大使用量等。 2.3、显示信号量状态 使用list_sem 命令来显示系统中所有信号量信息,包括信号量的名称、信号量的值和等待这个信号...
/* 线程 1 的对象和运行时用到的栈 */ static struct rt_thread thread1; static rt_uint8_t thread1_stack[512]; /* 线程 1 入口 */ void thread1_entry(void* parameter) { int i; while (1) { for (i = 0; i < 10; i ++) { rt_kprintf("%d\n", i); /* 延时 100ms */ rt_...