標(biāo)題:
以為是sizeof問題,后來(lái)發(fā)現(xiàn)是C語(yǔ)言指針定義問題,記錄下遇到的問題(1)
[打印本頁(yè)]
作者:
songjie_he
時(shí)間:
2022-3-2 23:13
標(biāo)題:
以為是sizeof問題,后來(lái)發(fā)現(xiàn)是C語(yǔ)言指針定義問題,記錄下遇到的問題(1)
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; //////指針類型定義錯(cuò)誤,造成極其嚴(yán)重的后果。
(應(yīng)改為e_uint8_t)
e_cpu_reg_to_save *cpu_save_reg;
stk = thread -> stack_addr;///獲取任務(wù)的堆棧
stk = stk + thread->size;/////取得任務(wù)的堆棧最大值,因?yàn)槭窍蛳律L(zhǎng)的
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;
}
作者:
songjie_he
時(shí)間:
2022-3-3 16:16
本帖最后由 songjie_he 于 2022-3-3 16:18 編輯
這個(gè)是我自己寫的RTOS中任務(wù)堆棧初始化的函數(shù),僅供參考,參考的是RT_THREAD。適用于堆棧向下生長(zhǎng)的處理器。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1