5210|1

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CM3内核上下文切换求助 [复制链接]

各位大牛好:我最近在往EFM32(Cortex-M3内核)上移植一个简单的轮询操作系统,这个操作系统是在FreeRTOS基础上裁剪而来,使用内部Systimer中断进行时间片切换。关于上下文切换处的汇编代码,我是在FreeRTOS基础上写的,但是创建了四个任务后,由任务1切到任务2、任务2切到任务3、任务3切到任务4都没问题,但是由任务4切换到任务1时死掉。小弟被卡了好几天了,在此将源码贴上,麻烦大家帮忙看看是怎么回事。拜谢!

图中的代码几乎按照FreeRTOS来的,其中uxSavedTaskStackPointer指向的是pxCurrentTCB的第一个成员pTopOfStack。
是入栈保存不对还是怎么样呢?求大家帮忙。。。也可加小弟QQ 245128018 交流,谢谢啦
此帖出自ARM技术论坛

最新回复

本帖最后由 samos2011 于 2016-5-24 17:17 编辑 如果是切换到一个新创建的任务没有问题而切换到一个已运行过的任务时有问题则是上下文保存不正确 给个容易理解的例子给你: // 假设C代码有以下定义 typedef struct TCB{                 //...         void* stack; // 任务栈顶地址 汇编使用,offset 0x0C         //... }TCB; struct _OS{         TCB* run; // 正在运行的任务  汇编使用,offset 0x00         TCB* rdy; // 就绪的任务      汇编使用,offset 0x04         // ... }os; ;*************************************** ; * @brief  任务切换宏,使用了R0,R1,R2,R3寄存器 ;***************************************          MACRO         OS_TASK_SWITCH         ; os.run->stack = SP;         LDR                R2,=os         LDR                R1,[R2,#0x0]         MRS                R3,PSP         STR                R3,[R1,#0xC]         ; os.run = os.rdy;         LDR                R0,[R2,#0x4]                 STR                R0,[R2,#0x0]                 ; SP = os.rdy->stack         LDR                R1,[R2,#0x4]         LDR                R0,[R1,#0xC]         MSR                PSP,R0         MEND                   ;**************************************** ; * @brief  【PendSV异常处理】 ;**************************************** PendSV_Handler         PUSH         {LR}         MRS   R0,PSP         STMFD R0!,{R4-R11}         MSR   PSP,R0                  BL OS_Sched        ; C语言任务调度         OS_TASK_SWITCH                  MRS   R0,PSP         LDMFD R0!,{R4-R11}         MSR   PSP,R0         POP   {PC}    复制代码   详情 回复 发表于 2016-5-24 12:31
点赞 关注
 

回复
举报

130

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
本帖最后由 samos2011 于 2016-5-24 17:17 编辑

如果是切换到一个新创建的任务没有问题而切换到一个已运行过的任务时有问题则是上下文保存不正确

给个容易理解的例子给你:



  1. // 假设C代码有以下定义
  2. typedef struct TCB{        
  3.         //...
  4.         void* stack; // 任务栈顶地址 汇编使用,offset 0x0C
  5.         //...
  6. }TCB;

  7. struct _OS{
  8.         TCB* run; // 正在运行的任务  汇编使用,offset 0x00
  9.         TCB* rdy; // 就绪的任务      汇编使用,offset 0x04
  10.         // ...
  11. }os;

  12. ;***************************************
  13. ; * @brief  任务切换宏,使用了R0,R1,R2,R3寄存器
  14. ;***************************************
  15.          MACRO
  16.         OS_TASK_SWITCH
  17.         ; os.run->stack = SP;
  18.         LDR                R2,=os
  19.         LDR                R1,[R2,#0x0]
  20.         MRS                R3,PSP
  21.         STR                R3,[R1,#0xC]
  22.         ; os.run = os.rdy;
  23.         LDR                R0,[R2,#0x4]        
  24.         STR                R0,[R2,#0x0]        
  25.         ; SP = os.rdy->stack
  26.         LDR                R1,[R2,#0x4]
  27.         LDR                R0,[R1,#0xC]
  28.         MSR                PSP,R0
  29.         MEND
  30.         
  31.         
  32. ;****************************************
  33. ; * @brief  【PendSV异常处理】
  34. ;****************************************
  35. PendSV_Handler
  36.         PUSH         {LR}
  37.         MRS   R0,PSP
  38.         STMFD R0!,{R4-R11}
  39.         MSR   PSP,R0
  40.         
  41.         BL OS_Sched        ; C语言任务调度
  42.         OS_TASK_SWITCH
  43.         
  44.         MRS   R0,PSP
  45.         LDMFD R0!,{R4-R11}
  46.         MSR   PSP,R0
  47.         POP   {PC}   
复制代码

此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表