最近按照火哥的《RT-Thread内核实现与应用开发实战指南》学习RTThread的内核实现,在第七章调试的时候遇到一个Hardfault_Handler问题,单步调试的时候发现问题出在void rt_tick_increase(void)上,下面是void rt_tick_increase(void)的代码, 其中线程最大优先级RT_THREAD_PRIORITY_MAX = 32,有三个线程flag1_thread,flag2_thread,idle_thread,分别放在rt_thread_priority_table[0],rt_thread_priority_table[1],rt_thread_priority_table[31]:
void rt_tick_increase(void)
单步调试的时候,变量i =0x0000001C,rt_thread_priority_table[31].next = 0x2000005EC,idle_thread.tlist = 0x2000005EC,此时基本符合预期。
单步调试数据
继续单步运行,运行到如下图左框所示断点位置的时候(thread->remaining_tick --;),右侧变量rt_thread_priority_table[31].next = 0x2000005EB,指向一个未知的位置,按照预期,rt_thread_priority_table[31].next应该指向idle_thread.tlist, 所以后面跑的时候出现HardFault_Handler问题.
单步调试2
为了查找是什么导致rt_thread_priority_table[31].next 变化,我对比了一下火哥的示例代码,发现在rtdef.h文件中的struct rt_list_node 定义和我的不同:
火哥的定义:
/*
*************************************************************************
* 双向链表结构体
*************************************************************************
*/
struct rt_list_node
{
struct rt_list_node *next; /* 指向后一个节点 */
struct rt_list_node *prev; /* 指向前一个节点 */
};
typedef struct rt_list_node rt_list_t;
下面是我的定义:
/* 定义一个双向循环链表 */
struct rt_list_node
{
struct rt_list_node *prev; //指向前一个节点
struct rt_list_node *next; //指向后一个节点
};
typedef struct rt_list_node rt_list_t;
两者的区别是指向前一个节点和指向后一个节点的指针在结构体中的位置不一样,按照火哥的定义更改后,代码运行正常。以我有限的数据结构的知识来看,结构体中定义的指针是前一个节点和后一个节点所在内存位置的地址,两个地址应该是等价的。为什么变换两个指针的位置,好像导致了后面内存出问题?请大神指导一下,@fire @flyleaf
|