关于Ucosii的移植与API函数接口简介

来源:互联网 发布:图像对比度增强算法 编辑:程序博客网 时间:2024/05/01 21:14

1. 移植ucos操作系统所包含的工程文件以及针对每个CPU所裁剪的工程文件。

2. OSInit();//初始化操作系统

3. OS_CPU_SysTickInit(168000000/OS_TICKS_PER_SEC);//初始化系统时钟,一秒钟多少个时间节拍

4. OSTaskCreate(LED1_Task,0,&LED1_TASK_STK[99] ,LED1_TASK_PRIO);//创建任务(任务函数,传参数(一般为void*0),任务堆栈,优先级( 使 0 123 , 以 及OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级uC/OS系统保留,其余的56个优先级提供给应用程序。))

创建任务函数返回值可判断任务是否创建成功:

OS_ERR_NONE: 创建成功。

OS_ERR_PRIO_EXIST: 所请求的优先级已经存在。

OS_ERR_PRIO_INVALIDprioOS_LOWEST_PRIO高。

OS_ERR_NO_MORE_TCB: μC/ OS-II并没有任何更多的OS_TCBs分配。

OS_ERR_TASK_CREATE_ISR:试图从ISR创建任务,不允许。

在初始化任务堆栈时,堆栈的结构必须与CPU中断后寄存器入栈的顺序结构相同 

ARM的CPU一般是递减的栈,对堆栈数组取地址时一般取尾地址。空间大小最少17*4

扩展函数:INT8U OSTaskCreateExt(void (*task)(void *pd),

void *pdata,

OS_STK *ptos,

INT8U prio,

INT16U id,

OS_STK *pbos,

INT32U stk_size,

void *pext,

INT16U opt);

可检查堆栈的状态INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data); 

OSStatInit();//初始化统计任务

OSTaskDel(INT8U prio);            //删除一个任务

5. OSStart();//启动操作系统(在调用OSStart( )之前必须先调用OSInit ( ))。

 

 

二、任务间的切换

1. 首先必须发生系统调度OS_Sched();(系统时钟systick,有一些API函数)。

2. 系统调度不一定能产生任务切换。(优先级)

 

三、任务间同步、任务间信息交换

1. 信号量

OSSemCreate ()//作用: 建立并初始化一个信号量。

INT16UOSSemAccept(OS_EVENT *pevent); //无等待查看消息邮箱是否收到信号(没有信号量后面的程序先执行)

void OSSemPend (OS_EVENT *pevent,INT32U timeout,INT8U *perr); //挂起任务等待一个信号量,时间节拍置0为永久等待模式(实时性较高,有信号量后面的程序才执行,不可以在中断中调用)OSSemPend在等待的过程中会释放CPU控制权而OSMboxAccept 不会要自己写延时函数

 

INT8U OSSemPost(OS_EVENT *pevent); //作用: 发出一个信号量,把信号值加 1

2. 互斥信号量

OS_EVENT *OSMutexCreate (INT8U prio,INT8U *perr); //建立并初始化一个互斥信号量

void OSMutexPend (OS_EVENT *pevent,INT32U timeout,NT8U *perr); //阻塞任务等待互斥信号

INT8U OSMutexPost (OS_EVENT *pevent); //释放一个互斥信号

OSMutexPendOSMutexPost必须成对出现

 

3. 消息邮箱

OS_EVENT *OSMboxCreate (void *pmsg); //创建一个消息邮箱

INT8U OSMboxPost (OS_EVENT *pevent,void *pmsg); //向邮箱发送一则消息

(发送消息太慢与接收信息不同步:例如按键,可用数组定义按键值,发送数组地址)

void *OSMboxPend (OS_EVENT *pevent,INT32U timeout,INT8U *perr); //挂起任务等待一则消息

 

4. 消息队列

OS_EVENT *OSQCreate (void **start,INT16U size) //建立并初始化一个消息队列

(需定义一个消息队列指针数组。)

INT8U OSQPost (OS_EVENT *pevent,void *pmsg); //向消息队列发送一则消息

void *OSQAccept (OS_EVENT *pevent,INT8U *perr); //无等待接收一则消息

5. 事件标志组

OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags,INT8U *perr); //创建一个事件标志组

OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp,OS_FLAGS flags,INT8U opt,INT8U *perr); //设置事件标志组中第几位标志什么事件

OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp,OS_FLAGS flags,INT8Uwait_type,INT32U timeout,INT8U *perr); //设置对比获得的标志组第几位是否置位或者清零

OS_FLAG_CONSUME可以加在等待类型后面作用为清楚获得的标志位使程序只执行一次

在用事件标志组作用于按键识别时必须让任务调度延时函数节拍数短一点用于实时的按键扫描,如果太长可能导致按键无法获取

OS_FLAGS OSFlagPendGetFlagsRdy (void); //获得是哪一位或者那几位条件满足

 

事件控制块:创建一个事件(信号量、消息邮箱。。)就会申请一个事件控制块。

 

四、软件定时器

OS_TMR *OSTmrCreate(INT32U dly,INT32U period,INT8U opt,OS_TMR_CALLBACK callback,void *callback_arg,INT8U *pname,INT8U *perr) //创建一个软件定时器 称为一个时间控制块OS_TMR_CALLBACK callback//创建一个回调函数,在此函数里面所需执行任务

BOOLEAN OSTmrStart(OS_TMR *ptmr,INT8U *perr); //启动软件定时器

作用:如果你需要一个任务固定定时多少秒执行一次可利用此定时器

(移植的时候看文件是否给时间控制块分配空间,如果没有可以手动分配,时间控制块优先级需要自己定义,一般高于你工程中所有的优先级)

 

五、内存管理(相当于malloc和free);

六、临界区宏定义

相当于执行一条汇编语句去关闭所有的中断或者打开所有的中断

作用:如果一个任务不想被任何任务打断执行,包括中断可调用此宏。

原创粉丝点击