ucosii任务切换OS_TASK_SW()

  stm32F103中任务切换定义

1 //任务切换宏,由汇编实现.
2 #define  OS_TASK_SW()         OSCtxSw()

os_cpu_a.asm中任务切换函数的定义

1 NVIC_INT_CTRL       EQU     0xE000ED04  ; 中断控制寄存器
2 NVIC_SYSPRI2        EQU     0xE000ED20  ; 系统优先级寄存器(2)
3 NVIC_PENDSV_PRI     EQU     0xFFFF0000  ; PendSV中断和系统节拍中断
4                                         ; (都为最低,0xff).
5 NVIC_PENDSVSET      EQU     0x10000000  ; 触发软件中断的值.
 1 ;/**************************************************************************************
 2 ;* 函数名称: OSCtxSw
 3 ;*
 4 ;* 功能描述: 任务级上下文切换
 5 ;*
 6 ;* 参    数: None
 7 ;*
 8 ;* 返 回 值: None
 9 ;***************************************************************************************/
10
11 OSCtxSw
12         PUSH    {R4, R5}
13         LDR     R4, =NVIC_INT_CTRL      ;触发PendSV异常 (causes context switch)
14         LDR     R5, =NVIC_PENDSVSET
15         STR     R5, [R4]
16         POP     {R4, R5}
17         BX      LR

  1)任务切换很简单, 由以下两步完成, 将被挂起任务的微处理器寄存器推入堆栈, 然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。

  在uC/OS-II中, 就绪任务的栈结构总是看起来跟刚刚发生过中断一样, 所有微处理器的寄存器都保存在栈中。 换句话说, uC/OS-II运行就绪态的任务所要做的一切, 只是恢复所有的CPU寄存器并运行中断返回指令。

  为了做任务切换, 运行OS_TASK_SW(),人为模仿了一次中断。 多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。 中断服务子程序或陷阱处理(Trap hardler), 也称作事故处理(exception handler), 必须提供中断向量给汇编语言函数OSCtxSw()。 OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务, 参见第8章, 移植uC/OS-II, 有关于OSCtxSw()的更详尽的解释。

  人为模仿中断分析http://www.cnblogs.com/WeyneChen/p/4891885.html

通过向中断控制及状态寄存器ICSR的第28位写1来人为悬起中断,若是当前没有高优先级中断产生,那么程序将会进入PendSV handler

 1 ;/**************************************************************************************
 2 ;* 函数名称: OSPendSV
 3 ;*
 4 ;* 功能描述: OSPendSV is used to cause a context switch.
 5 ;*
 6 ;* 参    数: None
 7 ;*
 8 ;* 返 回 值: None
 9 ;***************************************************************************************/
10
11 PendSV_Handler
12     CPSID   I                                                   ; Prevent interruption during context switch
13     MRS     R0, PSP                                             ; PSP is process stack pointer 如果在用PSP堆栈,则可以忽略保存寄存器,参考CM3权威中的双堆栈-白菜注
14     CBZ     R0, PendSV_Handler_Nosave                            ; Skip register save the first time
15
16     SUBS    R0, R0, #0x20                                       ; Save remaining regs r4-11 on process stack
17     STM     R0, {R4-R11}
18
19     LDR     R1, =OSTCBCur                                       ; OSTCBCur->OSTCBStkPtr = SP;
20     LDR     R1, [R1]
21     STR     R0, [R1]                                            ; R0 is SP of process being switched out

下面是cortex-M3的通用寄存器,助于理解上面汇编指令。

时间: 2024-08-07 05:13:07

ucosii任务切换OS_TASK_SW()的相关文章

uCOS-ii笔记

ucos ii system 文件结构 上层: 应用软件,用户代码 中层: 与处理器无关代码 与应用程序相关配置文件 与处理器有关代码 下层: 硬件(cpu,interupt,timer,gpio,iis-) 内核结构 ucos的内核机构可以从以下的代码可以看出,应用支持10个事件控制块,5个事件标志组,5个内存区块,4个队列控制块和20个任务,最低优先级为63,任务堆栈大小都为128等等,这些都是可以在OS_CFG.H中自行定义的. 临界段 处理器处理临界代码都必须先关中断,再处理临界代码,然

uC/OS-II核心(Os_core)块

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel*                      

嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel  RTOS* ***************

ucos调度器详解

这一片谈谈关于ucos调度器的相关知识. ucos的调度器的实现主要靠一个函数OS_Sched 该函数将调度器的行为分为了两个部分,第一是调度部分,第二是任务切换部分,如下 void  OS_Sched (void) { #if OS_CRITICAL_METHOD == 3u OS_CPU_SR  cpu_sr = 0u; #endif OS_ENTER_CRITICAL(); if (OSIntNesting == 0u) { if (OSLockNesting == 0u) { OS_Sc

(转)UCOSII在任务切换与出入中断时堆栈指针的使用

1 uc/os ii在M3中的堆栈结构 1.1 M3入账序列  1.2 加上手工入栈序列  2 PendSV在Cortex-M3中的应用 Systick为嵌入到内核中,优先级比一般中断优先级高.若在一般中断的ISR执行过程中,发生了Systick异常,则Systick会抢占该ISR.若此时Systick做上下文切换,在M3中将触发用法fault(在中断活跃时尝试切入线程模式).即使在别的内核体系下不发生硬fault,ISR也会被延迟,这对于任一讲究实时性的系统是不能接受的. 所以Systick只

uC/OS II 任务切换原理

今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引发一次中断,自动将CS.IP寄存器压入堆栈,再利用中断返回,将新任务的任务断点指针弹出到CPU的CS.IP寄存器中,实现任务切换.虽然明白个大概,但是其中的细节却有点模糊,为什么调用IRET中断返回指令后,弹入CPU的CS.IP寄存器的断点指针是新任务的断点指针,而不是当前任务的,UCOS II是如

uCGUI 按键窗口切换机制(更新篇)

在之前文章中,讲述了一个低内存使用量的的窗口切换机制.有人会问,低内存使用量是多低呢,我这里举个例子.我有一个项目中使用到本切换机制,128*64的单色屏,初步计算有105个窗口(后面还会增加),总内存使用量(包括任务栈)=105*3*4(窗口树) + 1024(公共buff) + 512(任务栈) + 1024*3(uCGUI动态内存) = 6k左右.从这个数字可以看出内存算是使用比较少的了.毕竟有100多个窗口,我在设计时也就只做了10多个窗口,这100多个窗口就是由10多个窗口大量复用组合

ucos-ii在ti dsp 28377芯片上的运行过程和移植过程

1.移植过程 在将ucos移植到28377d平台上时主要遇见了下面几个问题, 1) 文件怎么组织,是通过修改micrim上提供的28335一直代码修改而成的,下载地址为:https://www.micrium.com/. 2)移植完成后发现创建任务完成后,任务无法跳转,移植在主函数中来回循环 3)当使用ostimedly()函数对任务延时,当延时时间已经完成,系统无法跳出空任务循环,移植在IdleTask中运行 4)任务切换过程中总是跳入到异常中断中. 移植思路: 开始移植过程时,下载了micr

【ucosii】笔记1:移植

前言 ucosii的代码,可以分为两部分:与cpu无关的代码,与cpu有关.移植的主要工作就是修改与cpu有关的部分代码. ucosii的代码结构 与cpu无关的代码              与cpu无关的代码 os_config.h 操作系统配置文件 os_cpu.h 处理器相关头文件 ucos_ii.h 操作系统头文件 os_cpu.c 处理器相关c文件 os_core.c 内核 os_cpu_a.asm 处理器相关汇编文件 os_task.c 任务管理     os_time.c 时间管