UC/OS—III 的常用资料整理
作者:~风中的叶~ QQ:654705188
任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和 CPU 寄存器的值。
全局变量的保护:
1.如果只在一个任务中写(或只有一个数据),而在其他任务中只是读取,则可以不用互
斥型信号量,最多会造成读取的数据未被完全写完。
2.如果全局变量在多个任务中写,则需要用互斥型信号量保护,这样当有任务申请到互斥
型信号量(保护不可重入的程序段)写数据时,其他任务的同一个互斥型信号量必须等待
上一个任务的释放才可进行写。
3.如果全局变量在中断中写,则在其他任务中的全局变量的写操作要用临界段(禁止中断
和禁止调度:保护不可被分割的程序段)保护。(因为如果不关中断相当于中断的优先级最
高,而且不能被像其他任务那样挂起。)
OS_CFG_ISR_POST_DEFERRED_EN 为 1 临界段使用锁调度器方式;
为 0 临界段使用禁中断方式
(CPU_SR_ALLOC();存放中断的变量
OS_CRITICAL_ENTER();OS_CRITICAL_EXIT();
OS_CRITICAL_EXIT_NO_SCHED();
OSSchedLockNes$ngCtr 记录调度器被锁的次数)。
检测任务堆栈的使用情况:
OS_CFG_STAT_TASK_STK_CHK_EN 使能
OS_ERRerr;
CPU_STK_SIZEstk_free;
CPU_STK_SIZEstk_used;
OSTaskStkChk(&TaskBStkTCB,&stk_free,&stk_used,&err);
中断中使用 OSIntEnter();和 OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并
未用到 OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不
在中断服务程序中使用 OSIntEnter();和 OSIntExit();。
(有时候用:CPU_CRITICAL_ENTER();OSIntNes$ngCtr++;
CPU_CRITICAL_EXIT();替代 OSIntEnter();)
一、’’变量类型
在 cpu.h 中是有关 cpu 变量的重新定义,还包括 CPU_STK(CPU 堆栈类型),
和 CPU_STK_SIZE(CPU 堆栈类型的大小)的定义,CPU_SR(CPU 状态寄存
器的定义)。
在 os.h 中 是 有 关 os 类 型 的 定 义 如 OS_TCB ( 任 务 控 制 块 ) 、 OS_SEM ( 信 号 量 ) 、
OS_MUTEX(互斥型信号量)、OS_MSG(消息)、OS_Q(消息队列)、OS_ERR(系统错
误)等。
在 cpu_core.h 中是有关 cpu 的定义,如 CPU_ERR、CPU_TS、CPU_TS_TMR 等。