硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5909|回复: 5
收起左侧

[有问必答] 第5期:任务切换设计(时间片调度不带浮点)

[复制链接]

8

主题

33

回帖

7

积分

新手上路

积分
7
发表于 2015-3-25 17:03:30 | 显示全部楼层 |阅读模式
/ 任务堆栈 (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 ?
回复

使用道具 举报

8

主题

33

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2015-3-25 17:09:30 | 显示全部楼层
/* xPSR */ 程序状态寄存器,把第24位T,EPSR的T位置位,作用是?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2015-3-25 17:46:03 | 显示全部楼层
把你多发的另一个帖子删除了。 你的理解正确.
这个位必须设置为1,这个位是用来表明工作在Thumb状态,因为CM3/CM4仅支持Thumb状态。为0的话表示工作在ARM状态。
回复

使用道具 举报

8

主题

33

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2015-3-25 18:14:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:把你多发的另一个帖子删除了。 你的理解正确.
这个位必须设置为1,这个位是用来表明工作在Thumb状态,因为CM3/CM4仅支持Thumb状态。为0的话表示工作在ARM状态。 (2015-03-25 17:46) 
多谢,赞
回复

使用道具 举报

8

主题

33

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2015-3-26 16:26:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:把你多发的另一个帖子删除了。 你的理解正确.
这个位必须设置为1,这个位是用来表明工作在Thumb状态,因为CM3/CM4仅支持Thumb状态。为0的话表示工作在ARM状态。 (2015-03-25 17:46) 
第5期:任务切换设计(时间片调度带浮点) 这个实验为什么初始化堆栈是在SVC中?
回复

使用道具 举报

38

主题

136

回帖

40

积分

初级会员

积分
40
发表于 2015-3-26 17:59:24 | 显示全部楼层

回 wwjdwy 的帖子

wwjdwy:第5期:任务切换设计(时间片调度带浮点) 这个实验为什么初始化堆栈是在SVC中?
 (2015-03-26 16:26) 
没有什么特别含义,只是展示下SVC在OS中的使用。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 22:21 , Processed in 0.040709 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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