找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1470|回复: 1
收起左侧

以为是sizeof问题,后来发现是C语言指针定义问题,记录下遇到的问题(1)

[复制链接]
ID:251368 发表于 2022-3-2 23:13 | 显示全部楼层 |阅读模式
typedef struct
{
e_uint32_t r0;
e_uint32_t r1;
e_uint32_t r2;
e_uint32_t r3;

e_uint32_t r12;
e_uint32_t lr;
e_uint32_t pc;
e_uint32_t xpsr;        
}e_cpu_reg;

typedef struct
{
e_uint32_t r4;
e_uint32_t r5;
e_uint32_t r6;
e_uint32_t r7;

e_uint32_t r8;
e_uint32_t r9;
e_uint32_t r10;
e_uint32_t r11;
        
e_cpu_reg cpu_reg_autosave;        
}e_cpu_reg_to_save;


void *e_thread_sp_init(e_thread *thread)
{
e_uint32_t        *stk;  //////指针类型定义错误,造成极其严重的后果。(应改为e_uint8_t)
e_cpu_reg_to_save *cpu_save_reg;
        
stk =  thread -> stack_addr;///获取任务的堆栈        
stk = stk + thread->size;/////取得任务的堆栈最大值,因为是向下生长的
stk = (stk - (((e_uint32_t)stk) % 8));        /////模8处理,地址不
stk = stk - (sizeof(e_cpu_reg_to_save));////从底部腾出CPU需要保存的寄存器占用的地址
         
cpu_save_reg        = (e_cpu_reg_to_save *)stk;
        
cpu_save_reg ->cpu_reg_autosave.r0= 0x0;        
cpu_save_reg ->cpu_reg_autosave.r1 = 0x1;
cpu_save_reg ->cpu_reg_autosave.r2 = 0x2;
cpu_save_reg ->cpu_reg_autosave.r3 = 0x3;
cpu_save_reg ->cpu_reg_autosave.r12 = 0x12;         
        
cpu_save_reg ->cpu_reg_autosave.lr = 0xdeadbeef;
cpu_save_reg ->cpu_reg_autosave.pc = (e_uint32_t)(thread -> program);
cpu_save_reg ->cpu_reg_autosave.xpsr = 0x01000000;
         
cpu_save_reg ->r4  = 0x04;
cpu_save_reg ->r5  = 0x05;
cpu_save_reg ->r6  = 0x06;
cpu_save_reg ->r7  = 0x07;
cpu_save_reg ->r8  = 0x08;
cpu_save_reg ->r9  = 0x09;
cpu_save_reg ->r10 = 0x0a;
cpu_save_reg ->r11 = 0x0b;

return stk;
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:251368 发表于 2022-3-3 16:16 | 显示全部楼层
本帖最后由 songjie_he 于 2022-3-3 16:18 编辑

这个是我自己写的RTOS中任务堆栈初始化的函数,仅供参考,参考的是RT_THREAD。适用于堆栈向下生长的处理器。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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