资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
UC/OSIII 的常用资料整理作者:风中的叶 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();OSSchedLockNestingCtr 记录调度器被锁的次数) 。检测任务堆栈的使用情况:OS_CFG_STAT_TASK_STK_CHK_EN 使能OS_ERRerr;CPU_STK_SIZE stk_free;CPU_STK_SIZE stk_used;OSTaskStkChk(&TaskBStkTCB,&stk_free,&stk_used,&err);中断中使用 OSIntEnter(); 和 OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并未用到 OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不在中断服务程序中使用 OSIntEnter(); 和 OSIntExit();。(有时候用:CPU_CRITICAL_ENTER();OSIntNestingCtr+;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 等。CPU_STK:typedef unsigned int 堆栈的类型定义OS_TCB:struct os_tcb 任务控制块的类型定义OS_ERR:enum os_err 错误信息定义CPU_TS:typedef unsigned int 时间戳变量CPU_TS_TMR:typedef unsigned int 定时器变量二、 全局变量(OS_CFG_STAT_TASK_EN 使能且调用了 OSStatTaskCPUUsageInit(&err);则开启了统计任务的功能:可以统计 CPU 使用率等。 )OSStatTaskCPUUsage:CPU 的使用率(010000= 0.00-100.00%)OSStatTaskCPUUsageMax:CPU 的使用率最大值(010000= 0.00-100.00%)OSTaskCtxSwCtr:任务切换次数的记录变量OSStatTaskCtr:已经建立了的任务数三、常用函数一、 OS_CORE.C(1 ) void OSInit() /系统初始化(2 ) void OSIntEnter() /发生了一次中断(中断嵌套的逐层进入)(3 ) void OSIntExit() /退出了一次中断(中断嵌套的逐层退出)(4 ) void OSSched() /系统进行调度(5 ) void OSSchedLock() /给调度器上锁(6 ) void OSSchedUnlock() /给调度器解锁,成对使用(7 ) void OSStart() /启动多任务过程,在启动之前必须调用 OSInit(),并已建立一个任务。其中 OSStartHighRdy()必须调用 OSTaskSwHook(),并令 OSRunning = TRUE.(8 ) void OS_Pend() /挂起任务(9 ) void OS_Post() /解挂任务(10 )void OS_PendAbort() /取消挂起任务(11 )INT16UOSVersion () /返回 uc/os 的版本号*10000(12 )void OS_IdleTaskInit() /空闲任务初始化(13 )void OS_IdleTask() /空闲任务二、 OS_TASK.C(1 ) void OSTaskCreate(OS_TCB *p_tcb,/任务控制块CPU_CHAR *p_name,/任务名OS_TASK_PTR p_task,/任务函数指针void *p_arg,/任务函数参数OS_PRIO prio,/任务优先级CPU_STK *p_stk_base,/堆栈指针CPU_STK_SIZE stk_limit,/任务的堆栈剩余警戒线CPU_STK_SIZE stk_size,/任务的空间大小OS_MSG_QTY q_size, /能接收的信息队列最大值OS_TICK time_quanta,/时间片轮转时间void *p_ext,/ 任务控制块的扩展信息OS_OPT opt, /任务的选项OS_ERR *p_err) /任务的错误信息(2 ) void OSTaskChangePrio() /任务优先级别的改变(3 ) void OSTaskDel() /任务的删除(4 ) void OSTaskSuspend() /任务的暂停(5 ) void OSTaskResume() /任务的恢复(6 ) void OSTaskStkChk() /校核空余内存的数量(7 ) OS_MSG_QTY OSTaskQFlush() /清空任务级消息队列中的消息(8 ) void *OSTaskQPend() /挂起任务级消息队列(9 ) CPU_BOOLEAN OSTaskQPendAbort()/取消任务级消息队列的挂起状态(10 )void OSTaskQPost() /向任务级消息队列中发送消息(11 )OS_REG OSTaskRegGet() /获取任务寄存器的当前值(12 )void OSTaskRegSet() /设置任务寄存器的当前值(13 )OS_SEM_CTR OSTaskSemPend() /任务信号量等待信号(14 )CPU_BOOLEAN OSTaskSemPendAbort()/任务信号量取消挂起状态(15 )OS_SEM_CTR OSTaskSemPost() /任务信号量发送消息(16 )OS_SEM_CTR OSTaskSemSet() /设置任务信号量的计数值(17 )void OSTaskTimeQuantaSet() /改变任务的时间片voidTaskMain(void *pdata); /任务声明static OS_TCB TaskMainTCB; /任务控制块#define TASK_MAIN_PRIO 3 /任务优先级#define TASK_MAIN_STK_SIZE 256 /任务堆栈大小 256*4=1024Bstatic CPU_STK TaskMainStkTASK_MAIN_STK_SIZE;/任务堆栈定义OSTaskCreate(OS_TCB *)&TaskMainTCB, /任务的控制块 (CPU_CHAR *)Task Main Start, /任务的名称(OS_TASK_PTR )TaskMain, /任务的函数指针(void *)0, /任务的函数初值(OS_PRIO )TASK_MAIN_PRIO, /任务的优先级(CPU_STK *)&TaskMainStk0, /任务的堆栈(CPU_STK_SIZE)TASK_MAIN_STK_SIZE/10,/任务的堆栈剩余警戒线(CPU_STK_SIZE)TASK_MAIN_STK_SIZE,/任务的空间大小(OS_MSG_QTY )0, /所能接收的信息队列最大值(OS_TICK )0, /任务的时间片轮转时间(void *)0, /任务的任务控制块的扩展信息(OS_OPT )(OS_OPT_TASK_STK_CHK| OS_OPT_TASK_STK_CLR), /任务的选项(OS_ERR *)&err); /任务的错误信息三、 OS_TIME.C(1 ) void OSTimeDly() /以时钟节拍数为单位延时(2 ) void OSTimeDlyHMSM() /用时、分、秒、毫秒为单位延时(3 ) void OSTimeDlyResume() /取消任务中的延时,引发一次调度(4 ) OS_TICKOSTimeGet() /获取 OSTime 值(5 ) void OSTimeSet() /设置 OSTime 值四、 OS_SEM.C(1 ) void OSSemCreate() /创建信号量(2 ) OS_OBJ_QTY OSSemDel() /删除信号量(3 ) OS_SEM_CTR OSSemPend() /请求信号量(4 ) OS_SEM_CTR OSSemPost() /发送(释放)信号量(5 ) void OSSemSet() /设置信号量的计数值(6 ) OS_OBJ_QTYOSSemPendAbort() /取消信号量static OS_SEM AppSem; /定义一个信号量变量CPU_TS ts=0;/存放发送消息时的时间戳 OS_TS_GET();(获取当前时间戳 )OS_ERR err; /返回的错误信息OSSemCreate
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号