野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6788|回复: 2

[rt-thread] rtthread调试问题

[复制链接]
发表于 2019-4-20 11:04:06 | 显示全部楼层 |阅读模式
最近按照火哥的《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)

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

单步调试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  




回复

使用道具 举报

发表于 2019-4-23 10:44:42 | 显示全部楼层
这是魔改了吗?

有些地方有继承的,改了会造成不一致,必须所有的地方都与官方原版完全一致。
回复 支持 反对

使用道具 举报

发表于 2019-5-21 19:08:00 来自手机 | 显示全部楼层
.next和.prev的地址是不一样的,假设你定义一个rt_list_node的变量,名为list编译器分配给list的地址为x,那么.next的地址也等于x,而.prev的地址是.next的地址加上对齐字节,你把这两个元素倒换位置进行定义的时候,地址也跟着变化了,prev变成了原本.next的地址,.next变成了.prev的地址,这样你在不改变插入和调用的顺序的情况下,会造成指向错误
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-4 01:22 , Processed in 0.032399 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表