|
/ 任务堆栈 (8Kbytes each - 1024 x 8 bytes) 这里也可以采用4字节,并将双字的堆栈对齐方式关闭
uint32_t task0_stack[1024], task1_stack[1024], task2_stack[1024], task3_stack[1024];
uint32_t PSP_array[4]; // 用于在任务切换时记录PSP
函 数 名: OS_Start
* 功能说明: 任务启动
* 形 参:无
* 返 回 值: 无
* 说 明:第一次任务切换前,16个寄存器的存储
* |-----------------| stack[0]
* | .... |
* |-----------------|
* | .... |
* |-----------------|
* 低地址 | .... |
* |-----------------|
* ^ | R4 |
* ^ |-----------------|
* ^ | R5 |
* | |-----------------|
* | | R6 |
* | |-----------------|
* | | R7 |
* | |-----------------|
* | | R8 |
* | |-----------------|
* | | R9 |
* | |-----------------|
* | | R10 |
* | |-----------------|
* | | R11 |
* | |-----------------|
* | | R0 = p_arg |
* | |-----------------|
* | | R1 |
* | |-----------------|
* | | R2 |
* | |-----------------|
* | | R3 |
* | |-----------------|
* | | R12 |
* | |-----------------|
* | | LR |
* | |-----------------|
* | | PC = task |
* | |-----------------|
* | | xPSR |
* 高地址 |-----------------| stack[1024]
*
/* 创建任务0的堆栈 */
PSP_array[0] = ((unsigned int) task0_stack) + (sizeof task0_stack) - 16*4;
HW32_REG((PSP_array[0] + (14<<2))) = (unsigned long) task0; /* PC */
HW32_REG((PSP_array[0] + (15<<2))) = 0x01000000; /* xPSR */
PSP_array[0] = ((unsigned int) task0_stack) + (sizeof task0_stack) - 16*4;
此处存储的是栈顶tast0-stack[1023]-16*4,也就是tast0-stack[1007],存储R4的地方?
HW32_REG((PSP_array[0] + (14<<2))) = (unsigned long) task0; /* PC */
将task0的地址存储到tast0-stack[1022]=task0 ,
HW32_REG((PSP_array[0] + (15<<2))) = 0x01000000; /* xPSR */
tast0-stack[1023]=0x01000000 这个值是什么意思?
这三句话就是将PSP_array[0]存储到上图的R4位置,然后PC位置存储task0地址,最后一个栈存储0x01000000 ? |
|