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. 读写某个地址,导
动态线程初始化栈的过程,在 _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=(void*)rt_hw_stack_init(th...
void (*cleanup)(struct rt_thread *tid); /**< 线程退出时的清除函数 */ rt_uint32_t user_data; /**< 私有用户数据 */ }; 总的来看,线程皆有由几类成员组成:object,栈相关信息,优先级信息,事件,定时器信息,私有数据指针。在RT-Thread中提供的线程接口函数都是围绕线程的各种状态展开的。
每一个线程在初始化的时候,需要分配栈空间 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...
在这里 $Sub$$main 函数调用了 rtthread_startup() 函数,其中 rtthread_startup() 函数的代码如下所示: intrtthread_startup(void){rt_hw_interrupt_disable();/* 板级初始化: 需在该函数内部进行系统堆的初始化 */rt_hw_board_init();/* 打印 RT-Thread 版本信息 */rt_show_version();/* 定时器...
静态线程创建成功的话会返回0,失败的话会返回一个负值,若成功创建线程,我们调用rt_thread_startup函数使线程2进入就绪态,并执行线程处理函数。 if(ret < 0){LOG_E("rt2_thread_create create failed ...\n"); // 错误信息打印return ret;}LOG_D("rt_thread2_create create successes ...\n");rt_thre...
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。 主要代码如下 ...