嵌入式系统设计与实例开发——arm与cos-ⅱ第五讲c(编辑修改稿)内容摘要:
中断级的任务切换。 任 务 1C P S R , S P S RC P UR 0 R 1 5任 务 2堆 栈堆 栈53 中断处理过程 54 OSIntExit() void OSIntExit (void){ OS_ENTER_CRITICAL()。 (1) if ((OSIntNesting | OSLockNesting) == 0) { (2) OSIntExitY = OSUnMapTbl[OSRdyGrp]。 (3) OSPrioHighRdy = (INT8U)((OSIntExitY 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]])。 if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]。 OSCtxSwCtr++。 OSIntCtxSw()。 (4) } } OS_EXIT_CRITICAL()。 } 55 OSIntExit的关键 —— OSIntCtxSw 实现中断级的任务切换 ARM在栈指针调整过程中的优势 任 务 的 P C任 务 寄 存 器( r 0 r 1 2 )I R Q 中 堆 栈 的 使 用 情 况进 入 时 I R Q 的 S PU n k n o w nO S I n t C t x S w时 I R Q 的 S P堆 栈 的 增 长 方 向高 地 址低 地 址56 移植 181。 C/OSII要点 (3)—— Thumb带来的问题 很多 ARM内核集成了 16位 thumb指令集。 Thumb可以在一定程度上节省代码空间,提高系统效率。 Thumb会给中断级的任务切换带来麻烦。 CPSR中的 T位不能直接操作。 Thumb状态将导致 CPSR恢复以后的指令不能运行。 解决办法: 对 Thumb的使用必须保证原子操作。 专门对任务切换中 Thumb的情况作处理。 建议,小心使用 C编译器,尽量不使用 Thumb。 57 移植 181。 C/OSII的要点 (4)— 何时启动系统定时器 如果在 OSStart之前启动定时器,则系统可能无法正确执行完OSStartHighRdy。 OSStart函数直接调用 OSStartHighRdy去执行最高优先级的任务,OSStart不返回。 系统定时器应该在系统的最高优先级任务中启动。 使用 OSRunning变量来控制操作系统的运行。 在我们的移植版本中,使用了 181。 C/OSII中的保留任务 1作为系统任务,负责启动定时器。 58 例: C/OSII在 S3C44B0X上的移植 设置。 用 C语言编写六个操作系统相关的函数( )。 用汇编语言编写四个与处理器相关的函数( )。 59 设置与处理器和编译器相关的代码 。 比如: INT8U、INT8S等。 与 ARM处理器相关的代码,使用 OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启/关闭中断。 设置堆栈的增长方向 :堆栈由高地址向低地址增长。 60 设置 typedef unsigned char BOOLEAN。 typedef unsigned char INT8U。 typedef signed char INT8S。 typedef unsigned int INT16U。 typedef signed int INT16S。 typedef unsigned long INT32U。 typedef signed long INT32S。 typedef float FP32。 typedef double FP64。 typedef unsigned long OS_STK。 typedef unsigned long OS_CPU_SR。 extern int INTS_OFF(void)。 extern void INTS_ON(void)。 define OS_ENTER_CRITICAL() { cpu_sr = INTS_OFF()。 } define OS_EXIT_CRITICAL() { if(cpu_sr == 0) INTS_ON()。 } define OS_STK_GROWTH 1 /*从高向低 */ 61 程序状态寄存器 条件位: N = 1结果为负 ,0结果为正或 0 Z = 1结果为 0,0结果不为 0 C =1进位, 0借位 V =1结果溢出, 0结果没溢出 Q 位: 仅 ARM 5TE/J架构支持 指示增强型 DSP指令是否溢出 J 位 仅 ARM 5TE/J架构支持 J = 1: 处理器处于 Jazelle状态 中断禁止位: I = 1: 禁止 IRQ F = 1: 禁止 FIQ T Bit 仅 ARM xT架构支持 T = 0: 处理器处于 ARM 状态 T = 1: 处理器处于 Thumb 状态 Mode位 (处理器模式位 ): 0b10000 User 0b10001 FIQ 0b10010 IRQ 0b10011 Supervisor 0b10111 Abort 0b11011 Undefined 0b11111 System 27 31 N Z C V Q 28 6 7 I F T mode 16 23 8 15 5 4 0 24 f s x c U n d e f i n e d J 62 打开 /关闭中断 EXPORT INTS_OFF EXPORT INTS_ON INTS_OFF mrs r0, cpsr。 current CSR mov r1, r0。 make a copy for masking orr r1, r1, 0xC0。 mask off int bits msr CPSR_cxsf, r1。 disable ints and r0, r0, 0x80。 return IRQ bit mov pc,lr。 return INTS_ON mrs r0, cpsr。 current CSR bic r0, r0, 0x80。 mask on ints msr CPSR_cxsf, r0。 enable ints mov pc,lr。 return … 1 1 0 0 0 0 0 0 7 0 31 … 1 0 0 0 0 0 0 0 7 0 31 … I F T Mode 7 0 31 63 设置 OS_STK_GROWTH 绝大多数的微处理器和微控制器的堆栈是从上往下长的。 但是某些处理器是用另外一种方式工作的。 C/OSⅡ 被设计成两种情况都可以处理,只要在结构常量 OS_STK_GROWTH中指定堆栈的生长方式就可以了。 置 OS_STK_GROWTH为 0表示堆栈从下往上长。 置 OS_STK_GROWTH为 1表示堆栈从上往下长。 64 用 C语言编写六个操作系统相关的函数 void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelHook (OS_TCB *ptcb) void OSTaskSwHook (void) void OSTaskStatHook (void) void OSTimeTickHook (void) 后 5个函数为接口函数,可以不加代码。 65 OSTaskStkInit OSTaskCreate()和 OSTaskCreateExt()通过调用 OSTaskStkInit()来初始化任务的堆栈结构。 因此堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。 这里我们定义了堆栈是从上往下长的。 在用户建立任务时,用。嵌入式系统设计与实例开发——arm与cos-ⅱ第五讲c(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。