ucosiii常用函数

合集下载

UCOS-III文件系统的操作

UCOS-III文件系统的操作
并覆盖。 注意:当 _FS_READONLY == 1 时,模式标志 FA_WRITE,
FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。 返回值 FR_OK (0) 函数成功,该文件对象有效。 FR_NO_FILE 找不到该文件。 FR_NO_PATH 找不到该路径。 FR_INVALID_NAME 文件名无效。 FR_INVALID_DRIVE 驱动器号无效。 FR_EXIST 该文件已存在。 FR_DENIED 由于下列原因,所需的访问被拒绝:
二、文件的关闭
f_close 关闭一个打开的文件
FRESULT f_close ( FIL * FileObject
/* 文件对象结构的指针 */
); 参数
FileObject 指向将被关闭的已打开的文件对象结构的指针。 返回值 FR_OK (0) 文件对象已被成功关闭。 >FR_DISK_ERR 由于底层磁盘 I/O 函 数中的错误,而导致该函数失败。 FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
res = f_write(&fdst, buffer, br, &bw); if (res || bw < br) break; /* 磁盘满错误 */
} /* 关闭打开的文件 */
f_close(&fsrc);
f_close(&fdst); /* 注销工作区(在废弃前) */ f_mount(0, NULL); f_mount(1, NULL); }
FR_INT_ERR
由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 FR_INVALID_OBJECT 文件对象无效。 描述 f_lseek 函数当 FS_MINIMIZE <= 2 时可用。 offset 只能被指定为相对于文件起始处的字节数。当在写模式下指定了一个超过 文件大小的 offset 时,文件的大小将被扩展,并且该扩展的区域中的数据是未定 义的。这适用于为快速写操作迅速地创建一个大的文件。f_lseek 函数成功后, 为了确保读/写指针已被正确地移动,必须检查文件对象中的成员 fptr。如果 fptr 不是所期望的值,则发生了下列情况之一。 文件结束。指定的 offset 被钳在文件大小,因为文件已被以只读模式打开。 磁盘满。卷上没有足够的空闲空间去扩展文件大小。 例子

【ucos-III教程】第11章

【ucos-III教程】第11章

【ucos-III教程】第11章 uCOS-III内核函数分析(中)第11章 uCOS-III内核函数分析(中)本期教程开始分析µCOS-III的内核函数,源码的分析采⽤先对源码进⾏注释,然后讲解函数实现的功能和相关的原理分析,最后是举⼀个例⼦(如果这个函数是供外部函数调⽤的)。

内核函数很重要,是学习任务管理,任务间通信机制的基础。

希望初学的同学认真学习,这部分应该算是µCOS-III的核⼼代码。

11.1系统配置⽂件11.2源码⽂件11.3µCOS-III初始化11.4µCOS-III启动11.5获取系统版本11.6空闲任务11.7临界段11.8安全关键IEC6150811.9任务切换11.10调度锁11.11 Round-Robin调度11.12总结11.6 空闲任务⼏乎所有的⼩型RTOS中都会有⼀个空闲任务,空闲任务应该属于系统任务,是必须要执⾏的,⽤户程序不能将其关闭。

不光⼩型系统中有空闲任务,⼤型的系统⾥⾯也有的,⽐如XP,下⾯的截图就是XP中的空闲进程。

空闲任务主要有以下⼏个作⽤:l我们不能让系统⼀直在执⾏各个应⽤任务,这样的话系统利⽤率就是100%,系统就会⼀直的超负荷运⾏,所以空闲任务很有必要。

l为了更好的实现低功耗,空闲任务也很有必要,我们可以在空闲任务中实现睡眠,待机等低功耗措施。

11.6.1创建空闲任务OS_IdleTaskInit ()void OS_IdleTaskInit (OS_ERR *p_err){#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;#endifOSIdleTaskCtr = (OS_IDLE_CTR)0;OSTaskCreate((OS_TCB *)&OSIdleTaskTCB,(CPU_CHAR *)((void *)"uC/OS-III Idle Task"),(OS_TASK_PTR)OS_IdleTask,(void *)0,(OS_PRIO )(OS_CFG_PRIO_MAX - 1u),(CPU_STK *)OSCfg_IdleTaskStkBasePtr,(CPU_STK_SIZE)OSCfg_IdleTaskStkLimit,(CPU_STK_SIZE)OSCfg_IdleTaskStkSize,(OS_MSG_QTY )0u,(OS_TICK )0u,(void *)0,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS), (OS_ERR *)p_err);}关于任务的创建,本期教程暂时还不做介绍。

UCOSIII(一)

UCOSIII(一)

UCOSIII(⼀)⼀,前后台系统和RTOS1,前后台系统早期嵌⼊式开发没有嵌⼊式操作系统的概念,直接操作裸机,在裸机上写程序,⽐如⽤51单⽚机基本就没有操作系统的概念。

通常把程序分为两部分:前台系统和后台系统。

简单的⼩系统通常是前后台系统,这样的程序包括⼀个死循环和若⼲个中断服务程序:应⽤程序是⼀个⽆限循环,循环中调⽤API函数完成所需的操作,这个⼤循环就叫做后台系统。

中断服务程序⽤于处理系统的异步事件,也就是前台系统。

前台是中断级,后台是任务级。

2,RTOSRTOS全称为: Real Time OS,就是实时操作系统,强调的是:实时性。

实时操作系统⼜分为硬实时和软实时。

硬实时要求在规定的时间内必须完成操作,硬实时系统不允许超时,在软实时⾥⾯处理过程超时的后果就没有那么严格。

在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的⼀部分,每个任务都是⼀个很简单的程序,通常是⼀个死循环。

RTOS操作系统: UCOS, FreeRTOS, RTX, RT-Thread, DJYOS等。

RTOS操作系统的核⼼内容在于:实时内核。

3,可剥夺型内核RTOS的内核负责管理所有的任务,内核决定了运⾏哪个任务,何时停⽌当前任务切换到其他任务,这个是内核的多任务管理能⼒。

多任务管理给⼈的感觉就好像芯⽚有多个CPU,多任务管理实现了CPU资源的最⼤化利⽤,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应⽤。

可剥夺内核顾名思义就是可以剥夺其他任务的CPU使⽤权,它总是运⾏就绪任务中的优先级最⾼的那个任务UCOS系统简介UCOS是Micrium公司出品的RTOS类实时操作系统, UCOS⽬前有两个版本:UCOSII和UCOSIII。

UCOSIII是⼀个可裁剪、可剥夺型的多任务内核,⽽且没有任务数限制。

UCOSIII提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。

UCOSIII是⽤C和汇编来写的,其中绝⼤部分都是⽤C语⾔编写的,只有极少数的与处理器密切相关的部分代码才是⽤汇编写的, UCOSIII结构简洁,可读性很强!最主要的是⾮常适合初次接触嵌⼊式实时操作系统学⽣、嵌⼊式系统开发⼈员和爱好者学习。

UCOSIII 常用函数

UCOSIII 常用函数

任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和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,&e rr);中断中使用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状态寄存器的定义)。

uCOS操作系统46个基本函数汇总

uCOS操作系统46个基本函数汇总
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio);
所属文件 OS_TASK.C 调用者 任务 开关量 OS_TASK_CHANGE_PRIO_EN OSTaskChangePrio()改变一 个任务的优先级。 参数 oldprio 是任务原先的优先级。 newprio 是任务的新优先级。 返回值 OSTaskChangePrio()的返回值为下述之一: OS_NO_ERR:任 务优先级成功改变。 OS_PRO_INVALID:参数中的任务原先优先级或新优先级大于或等于 OS_LOWEST_PRIO。 OS_PRIO_EXIST: 参数中的新优先级已经存在。 OS_PRIO_ERR:参数中的任务原先优先级不存在。 注意/警告:参数中的新优先级必须是没有使用过的, 否则会返回错误码。在 OSTaskChangePrio()中还 会先判断要改变优先级的任务是否存在
uC/OS 操作系统 46 个基本函数汇总
Void OSInit(void);
所属文件 OS_CORE.C 调用者 启动代码 开关量 无
OSinit() 初始化 μC/OS-Ⅱ,对这个函数的调用必须在调用 OSStart()函数之前,
而 OSStart()函数真正开始运行多任务。
Void OSIntEnter(void);
Void OSSchedLock(void);
所属文件 OS_CORE.C 调用者 任务或中断 开关量 N/A OSSchedLock() 函数停止任务调度,只有使用配对的函数 OSSchedUnlock()才能重新开始内核的任务 调度。调用 OSSchedLock(断仍然可以被接受和执行(中断必须允许)。OSSchedLock()函数和 OSSchedUnlock()函数必须配 对使用。μC/OS-Ⅱ可以支持多达 254 层的 OSSchedLock()函数嵌套,必须调用同样次数的 OSSchedUnlock ()函数才能恢复任务调度。 注意/警告:任务调用了 OSSchedLock()函数后,决不能再调用 可能导致当前任务挂起的系统函数: OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。 因为任 务调度已经被禁止,其他任务不能运行,这会导致系统死锁。

【ucos-III教程】第11章

【ucos-III教程】第11章

【ucos-III教程】第11章 uCOS-III内核函数分析(上)第11章 uCOS-III内核函数分析(上)本期教程开始分析µCOS-III的内核函数,源码的分析采⽤先对源码进⾏注释,然后讲解函数实现的功能和相关的原理分析,最后是举⼀个例⼦(如果这个函数是供外部函数调⽤的)。

内核函数很重要,是学习任务管理,任务间通信机制的基础。

希望初学的同学认真学习,这部分应该算是µCOS-III的核⼼代码。

11.1系统配置⽂件11.2源码⽂件11.3µCOS-III初始化11.4µCOS-III启动11.5获取系统版本11.6空闲任务11.7临界段11.8安全关键IEC6150811.9任务切换11.10调度锁11.11 Round-Robin调度11.12总结11.1 系统配置⽂件下⾯先简单说明下µCOS-III中⼏个配置⽂件的作⽤,⽅便分析源码的时候查看,配置⽂件主要有以下⼏个:11.1.1 lib_cfg.h配置⽂件lib_cfg.h⽂件内容如下:#ifndef LIB_CFG_MODULE_PRESENT#define LIB_CFG_MODULE_PRESENT#define LIB_MEM_CFG_ARG_CHK_EXT_EN DEF_ENABLED#define LIB_MEM_CFG_OPTIMIZE_ASM_EN DEF_ENABLED#define LIB_MEM_CFG_ALLOC_EN DEF_ENABLED#define LIB_MEM_CFG_HEAP_SIZE 23u * 1024u#endiflib_cfg.h是⽤于给uC/LIB做配置的头⽂件。

如果程序中使⽤uC/LIB的话,需要调⽤函数Mem_Init()进⾏初始化。

11.1.2 os_cfg.h配置⽂件os_cfg.h⽂件中的内容如下:#ifndef OS_CFG_H#define OS_CFG_H#define OS_CFG_APP_HOOKS_EN 1u#define OS_CFG_ARG_CHK_EN 1u#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u#define OS_CFG_DBG_EN 1u#define OS_CFG_ISR_POST_DEFERRED_EN 0u#define OS_CFG_OBJ_TYPE_CHK_EN 1u#define OS_CFG_TS_EN 1u#define OS_CFG_PEND_MULTI_EN 1u#define OS_CFG_PRIO_MAX 64u#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 0u#define OS_CFG_SCHED_ROUND_ROBIN_EN 0u#define OS_CFG_STK_SIZE_MIN 64u#define OS_CFG_FLAG_EN 1u#define OS_CFG_FLAG_DEL_EN 1u#define OS_CFG_FLAG_MODE_CLR_EN 1u#define OS_CFG_FLAG_PEND_ABORT_EN 1u#define OS_CFG_MEM_EN 1u#define OS_CFG_MUTEX_EN 1u#define OS_CFG_MUTEX_DEL_EN 1u#define OS_CFG_MUTEX_PEND_ABORT_EN 1u#define OS_CFG_Q_EN 1u#define OS_CFG_Q_DEL_EN 1u#define OS_CFG_Q_FLUSH_EN 1u#define OS_CFG_Q_PEND_ABORT_EN 1u#define OS_CFG_SEM_EN 1u#define OS_CFG_SEM_DEL_EN 1u#define OS_CFG_SEM_PEND_ABORT_EN 1u#define OS_CFG_SEM_SET_EN 1u#define OS_CFG_STAT_TASK_EN 1u#define OS_CFG_STAT_TASK_STK_CHK_EN 1u#define OS_CFG_TASK_CHANGE_PRIO_EN 1u#define OS_CFG_TASK_DEL_EN 1u#define OS_CFG_TASK_Q_EN 1u#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u#define OS_CFG_TASK_PROFILE_EN 1u#define OS_CFG_TASK_REG_TBL_SIZE 1u#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u#define OS_CFG_TASK_SUSPEND_EN 1u#define OS_CFG_TIME_DLY_HMSM_EN 1u#define OS_CFG_TIME_DLY_RESUME_EN 1u#define OS_CFG_TMR_EN 1u#define OS_CFG_TMR_DEL_EN 1u#endif这个配置⽂件⽐较的重要,主要⽤于µCOS-III源码中相关函数的配置。

UCOS-III文件系统的操作

UCOS-III文件系统的操作

/* 为逻辑驱动器注册工作区 */
f_mount(0, &fs[0]);
f_mount(1, &fs[1]); /* 打开驱动器 1 上的源文件 */
res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);
if (res) die(res);
); 参数
FileObject 指向将被读取的已打开的文件对象结构的指针。
Buffer 指向存储读取数据的缓冲区的指针。
ByteToRead 要读取的字节数,UINT 范围内。
ByteRead
指向返回已读取字节数的 UINT 变量的指针。在调用该函数后,无论结果如何, 数值都是有效的。
返回值 FR_OK (0) 函数成功。 FR_DENIED 由于文件是以非读模式打开的,而导致该函数被拒绝。 FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。 FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。 FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。 FR_INVALID_OBJECT 文件对象无效。 描述 文件对象中的读/写指针以已读取字节数增加。该函数成功后,应该检查 *ByteRead 来检测文件是否结束。在读操作过程中,一旦 *ByteRead < ByteToRead ,则读/写指针到达了文件结束位置。
ModeFlags 指定文件的访问类型和打开方法。它是由下列标志的一个组合指定的。 模式 描述 FA_READ 指定读访问对象。可以从文件中读取数据。
与 FA_WRITE 结合可以进行读写访问。 FA_WRITE 指定写访问对象。可以向文件中写入数据。

uCosIII学习

uCosIII学习

uCosIII 学习本人前言:很久没有练习英语了,本想发点时间在工作之余,翻译一下&mu;C/OS III用户手册,发现还是有点吃力,于是乎,参见网络上的嘉兴学院的屈环宇同学的译本,谢谢!前言做为Micrium公司推出的第三代操作系统,&mu;C/OS III 支持现代的实时内核所期待的大部分功能;&mu;C/OS III是一个可裁剪、可固化、基于优先级的实时内核,支持例如资源管理、同步、任务间的通信等等。

同时&mu;C/OS III也具备一些很有特色的功能,是很多的其他的实时内核所不具备的,比如完备的实际测量性能、直接发送信号或消息到任务、任何可同时等待多个内核对象等。

与第二代&mu;C/OS II相比,&mu;C/OS III更加优秀,&mu;C/OS III中删除或更新了&mu;C/OS II中很少使用的一些功能;添加了更高效的功能和服务,比如时间片轮转调度(round robin)等,&mu;C/OS II最多支持64个任务,而&mu;C/OS III在理论上任务数量没有限第一章介绍实时系统软实时系统和硬实时系统的区别在于一旦没有在规定的时间内完成任务所导致后果的严重性。

超过时限后所得到的结果即使正确也可能是毫无作用的。

硬实时系统中,运算超时是不允许发生的。

在很多情况下,超时会导致巨大的灾难,会威胁人们的生命安全。

但是在软实时系统中,超时不会导致严重后果。

前后台系统简单的小型系统设计一般是基于前后台的或者无限循环的系统。

包含一个无限循环的模块实现需要的操作(后台)。

中断处理程序实现异步事件(前台)。

前台也叫做中断级,后台也叫作任务级。

多数高产量低成本微控制器的应用软件(例如微波炉,电话玩具等)都是基于前后台系统的。

实时内核实时内核是一个能管理MPU、MCU、DSP时间和资源的软件。

实时内核的应用包括迅速地响应,可靠地完成工作的各个部分。

ucos 时间戳函数

ucos 时间戳函数

ucos 时间戳函数
uC/OS是一个嵌入式实时操作系统,它提供了一些常用的函数来处理时间戳。

在uC/OS中,时间戳函数通常用于获取当前的系统时间或者将时间转换成时间戳的形式。

在uC/OS中,可以使用以下函数来处理时间戳:
1. OSTimeGet()函数,这个函数可以用来获取当前的系统时钟计数器的值,以表示当前的系统时间。

这个值可以被用来计算时间间隔或者进行时间戳记录。

2. OSTimeDly()函数,这个函数可以用来让任务延迟指定的时间,它可以接受以时钟节拍为单位的时间参数,可以用来实现定时功能。

3. OSTimeSet()函数,这个函数可以用来设置系统时钟计数器的值,以调整系统时间。

除了这些函数,uC/OS还提供了一些时间管理的工具和函数,比如定时器、时钟节拍等,这些工具可以用来实现更复杂的时间戳功能,比如定时器中断、定时任务等。

在使用这些时间戳函数时,需要注意系统时钟的精度、溢出处理、时钟节拍的设置等细节,以确保时间戳的准确性和稳定性。

同时,还需要根据具体的应用场景来选择合适的时间戳函数和时间管
理工具,以满足实际需求。

总的来说,uC/OS提供了丰富的时间戳函数和工具,可以满足
嵌入式系统对时间戳处理的需求,开发者可以根据具体的应用场景
来选择合适的时间戳函数和工具,以实现准确、稳定的时间戳功能。

uC OS III函数

uC OS III函数

uCOS-III常用函数参考手册陈俊辉OSInit(), 用于初始化uC/OS-III 。

OSInit ()初始化内部变量和数据结构,同时产生2 个到 5 个内部任务。

最低程度,uC/OS-III******************5 个内部任务**********************OS_IdleTask ()空闲任务;(OSIdleTaskHook() 并进入低功耗模式。

然后,进入OS_IdleTask()并循环)。

OS_TickTask()时基任务(通过配置OS_CFG_APP.H 中的OS_CFG_TICK_TASK_PRIO 。

通常设置其优先级较高。

事实上,它的优先级应该设置比重要任务的优先级稍低)。

OS_StatTask() 统计任务。

OS_TmrTask() 定时器任务。

OS_IntQTask() 中断队列处理任务(它的优先级通常被设为0 )。

(大多数的uC/OS-III 函数会通过一个指向OS_ERR 变量的指针返回一个错误代号。

如果OSInit() 初始化函数运行成功,错误代号被设为OS_ERR_NONE 。

如果在初始化不成功,uC/OS-III 会根据执行的结果返回对应的错误代号。

参照OS.H 中的错误代号。

3 个可选择的任务OS_CFG.H 中的配置决定)OSTaskCreate(),通过调用创建任务。

OSTaskCreate ()需要13 个参数。

第一个参数是任务堆栈的地址。

{ 该任务堆栈的开始地址} 详见第 5 章。

OSTaskDel (),如果任务的使命完成了,就要调用删除该任务。

实际上不是删除任务的代码,只是让任务不再具有使用;CPU 的资格而已。

OSTaskSuspend () 停止任务(暂停中的任务只能通过调用OSTaskResume() 被恢复)。

OSTaskResume () 恢复任务)。

(提交信号量到其它任务、发送消息到其它任务、提供共享资源等。

换句话说,任务不是只被限制于“等待事件”。

uCOS-III的任务调度算法研究

uCOS-III的任务调度算法研究

18 等等。
由 CPU_CntLeadZerosTbl 丌难看出,CPU_CntLeadZerosTbl[ix]的值只跟 ix 的最高
位有关,而不最高位后面的值无关,这样就取到了系统的当前行的最高优先级。
CPU_CntLeadZerosTbl[256]的定义如下:
static const CPU_INT08U CPU_CntLeadZerosTbl[256] = {
uC/OS-III 对任务数量无限制。实际上,任务的数量限制亍处理器能提供的内存大 小。每一个任务需要有自己的堆栈空间,uC/OS-III 在运行时监控任务堆栈的生长。 uC/OS-III 对任务的大小无限制 优先级数无限制
uC/OS-III 对优先级的数量无限制。然而,配置 uC/OS-III 的优先级在 32 到 256 乊间已经满足大多数的应用了。
时,丌要划分,故:
ix
= (CPU_INT08U)(val >> 0u);
此时 ,当前行中最高优先级除 8 的余数为:
nbr_lead_zeros = (CPU_DATA )(CPU_CntLeadZerosTbl[ix] + 0u);
假如 ix 此时为:
ix = 0010 0000
则 CPU_CntLeadZerosTbl[ix]=2u,即:当前系统任务的最高优先级可能为 2,10,
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x80 to 0x8F */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x90 to 0x9F */

ucosiii常用函数(1)

ucosiii常用函数(1)

任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和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_use d,&err);中断中使用OSIntEnter();和OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并未用到OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不在中断服务程序中使用OSIntEnter(); 和OSIntExit();。

(有时候用:CPU_CRITICAL_ENTER();OSIntNestingCtr++;CPU_CRITICAL_EXIT();替代OSIntEnter();)一、变量类型在中是有关cpu变量的重新定义,还包括CPU_STK (CPU堆栈类型),和CPU_STK_SIZE(CPU堆栈类型的大小)的定义,CPU_SR(CPU状态寄存器的定义)。

uCOS-III学习笔记

uCOS-III学习笔记

UCOS-III学习笔记一.知识要点1.用户代码不允许调用任务函数,任务一旦创建只能由UCOS-III调用2.每个任务都必须创建创建自己的堆栈,可以静态分配或由malloc()动态分配,但类型只能为CPU_STK3.任务优先级数越小越高,设置范围1~OS_CFG_PRIO_MAX-2,OS_CFG_PRIO_M AX在OS_CFG。

h中定义,系统默认的最大优先级为10,统计任务的优先级在os _CFG_app。

h中定义。

系统默认的一些优先级:统计任务:11OS_CFG_TICK_TASK_PRIO :104.分配堆栈大小时:1K=2565.OSTaskCreate()里面有些指针没有意义。

6.推荐在调用OSStart()函数之前只创建一个任务,因为此时UCOS—III 可以统计CPU的使用率7.每个任务都是一个无限循环,通过调用延时函数OSTimeDly()或OSTimeD lyHMSM()等待一个事件而被挂起。

8.任务不像C函数,没有return的。

9.只运行一次的任务结束时必须调用OSTaskDel()删除自己。

10.任务在等待事件时不会占用CPU11.一旦堆栈被动态分配就不能再回收,对于不需要删除的任务,建议动态分配堆栈12.uC/OS-III 允许用户在调用 OSStart() 之前创建任意个任务,但当用到统计任务统计 CPU 的使用率时,调用 OSStart()之前只允许创建1个任务,给这个任务一个相当高的优先级。

统计任务本身也有优先级OS_CFG_STAT_TASK_ PRIO,在os_CFG_app。

h中定义。

,此优先级排倒数第二,第一是空闲任务.13.任务要获得共享资源使用权就必须先获得互斥信号量(mutex),使用完后要释放mutex。

14.消息队列是任务与任务间的通信,未接受到消息队列的任务会被暂时挂起,处于等待接受的状态。

15.OSTimeDly(),任务调用这个函数后就会被挂起直到期满.二.单任务应用程序二.多任务管理程序主任务主任务中创建多个子任务四.统计任务这部分可以参考UCOS—ii的http://jingyan.baidu。

ucosIII_时间片轮转调度

ucosIII_时间片轮转调度

ucosIII_时间⽚轮转调度1.什么是时间⽚,他的作⽤是什么在UCOSII下,同⼀优先级下只能有⼀个任务。

在UCOSIII下,同⼀优先级下可以有多个任务。

所以在UCOSIII下引⼊时间⽚轮转调度解决相同优先级任务都可以执⾏的问题。

还需要注意的事,我们只需要配置时间⽚功能,系统即可⾃动完成调度,不需要⽤户⼿动调⽤函数。

配置过程在下⾯。

2.基本配置过程。

⽂件os_core.cvoid OSSchedRoundRobinCfg (CPU_BOOLEAN en,OS_TICK dflt_time_quanta,OS_ERR *p_err)这个是配置时间⽚的函数,第⼀个参数打开or关闭,第⼆个参数是分配给每个任务的时间⽚时间,第三个参数是保存返回值,记录了错误类型。

这个函数在程序中⼀般都在⼀个宏定义中:#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使⽤时间⽚轮转的时候//使能时间⽚轮转调度功能,时间⽚长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);#endifOS_CFG_SCHED_ROUND_ROBIN_EN 这个宏在os_cfg.h中#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u /* Include code for Round-Robin scheduling当我们在os_cfg.h⽂件中把这个宏定义为1时,UCOSIII会⾃动把所有和时间⽚有关的代码包括到所需要的地⽅去。

这个也符合系统可裁剪的规则,其他模块也是这样做的。

需要哪个模块则把该模块的宏定义打开。

看⼀下其他模块的宏定义:#define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */#define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */#define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */#define OS_CFG_ISR_POST_DEFERRED_EN 1u /* Enable (1) or Disable (0) Deferred ISR posts 通过调度器上锁来访问临界段*/#define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */#define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */到⽬前为⽌,时间⽚已经打开了。

UCOS-III-OSTaskCreate函数

UCOS-III-OSTaskCreate函数

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){CPU_STK_SIZE i;#if OS_CFG_TASK_REG_TBL_SIZE > 0uOS_REG_ID reg_nbr;#endif#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u) OS_TLS_ID id;#endifCPU_STK *p_sp;CPU_STK *p_stk_limit;CPU_SR_ALLOC();//黄色部分的意思就是新建几个变量#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;}#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == DEF_TRUE) {*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;return;}#endif//红色部分没啥用#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0uif (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ---------- CANNOT CREATE A TASK FROM AN ISR ---------- */*p_err = OS_ERR_TASK_CREATE_ISR;return;}#endif//检测是否在中断程序中调用此函数#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */if (p_tcb == (OS_TCB *)0) { /* User must supply a valid OS_TCB */*p_err = OS_ERR_TCB_INVALID;return;}if (p_task == (OS_TASK_PTR)0) { /* User must supply a valid task */*p_err = OS_ERR_TASK_INVALID;return;}if (p_stk_base == (CPU_STK *)0) { /* User must supply a valid stack base address */*p_err = OS_ERR_STK_INVALID;return;}if (stk_size < OSCfg_StkSizeMin) { /* User must supply a valid minimum stack size */*p_err = OS_ERR_STK_SIZE_INVALID;return;}if (stk_limit >= stk_size) { /* User must supply a valid stack limit */*p_err = OS_ERR_STK_LIMIT_INVALID;return;}if (prio >= OS_CFG_PRIO_MAX) { /* Priority must be within 0 and OS_CFG_PRIO_MAX-1 */*p_err = OS_ERR_PRIO_INVALID;return;}#endif//红色部分是传入参数检测#if OS_CFG_ISR_POST_DEFERRED_EN > 0uif (prio == (OS_PRIO)0) {if (p_tcb != &OSIntQTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use priority 0 */return;}}#endifif (prio == (OS_CFG_PRIO_MAX - 1u)) {if (p_tcb != &OSIdleTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use same priority as idle task */return;}}//黄色部分是不能把优先级定为0或者OS_CFG_PRIO_MAX - 1u。

UCOSIII 常用函数

UCOSIII 常用函数

任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和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,&e rr);中断中使用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状态寄存器的定义)。

UCOS-III OSTaskCreate函数

UCOS-III OSTaskCreate函数

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){CPU_STK_SIZE i;#if OS_CFG_TASK_REG_TBL_SIZE > 0uOS_REG_ID reg_nbr;#endif#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u) OS_TLS_ID id;#endifCPU_STK *p_sp;CPU_STK *p_stk_limit;CPU_SR_ALLOC();//黄色部分的意思就是新建几个变量#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)0) {OS_SAFETY_CRITICAL_EXCEPTION();return;}#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == DEF_TRUE) {*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;return;}#endif//红色部分没啥用#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0uif (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ---------- CANNOT CREATE A TASK FROM AN ISR ---------- */*p_err = OS_ERR_TASK_CREATE_ISR;return;}#endif//检测是否在中断程序中调用此函数#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */if (p_tcb == (OS_TCB *)0) { /* User must supply a valid OS_TCB */*p_err = OS_ERR_TCB_INVALID;return;}if (p_task == (OS_TASK_PTR)0) { /* User must supply a valid task */*p_err = OS_ERR_TASK_INVALID;return;}if (p_stk_base == (CPU_STK *)0) { /* User must supply a valid stack base address */*p_err = OS_ERR_STK_INVALID;return;}if (stk_size < OSCfg_StkSizeMin) { /* User must supply a valid minimum stack size */*p_err = OS_ERR_STK_SIZE_INVALID;return;}if (stk_limit >= stk_size) { /* User must supply a valid stack limit */*p_err = OS_ERR_STK_LIMIT_INVALID;return;}if (prio >= OS_CFG_PRIO_MAX) { /* Priority must be within 0 and OS_CFG_PRIO_MAX-1 */*p_err = OS_ERR_PRIO_INVALID;return;}#endif//红色部分是传入参数检测#if OS_CFG_ISR_POST_DEFERRED_EN > 0uif (prio == (OS_PRIO)0) {if (p_tcb != &OSIntQTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use priority 0 */return;}}#endifif (prio == (OS_CFG_PRIO_MAX - 1u)) {if (p_tcb != &OSIdleTaskTCB) {*p_err = OS_ERR_PRIO_INVALID; /* Not allowed to use same priority as idle task */return;}}//黄色部分是不能把优先级定为0或者OS_CFG_PRIO_MAX - 1u。

uCOS-III时间管理(二)

uCOS-III时间管理(二)

uCOS-III时间管理(⼆)时间管理就是⼀种建⽴在时钟节拍上,对操作系统任务的运⾏实现时间上管理的⼀种系统内核机制。

常⽤以下五个函数:OSTimeDly()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeGet ()OSTimeSet ()下⾯来介绍各个函数的作⽤。

OSTimeDly()OSTimeDly() 函数⽤于停⽌当前任务进⾏的运⾏,延时⼀段时间后再运⾏(和定时器中断有些类似)。

OSTimeDly()函数的信息如下表所⽰。

OSTimeDly() 函数中,如果函数的实参和调⽤场合均合法,就会调⽤OS_TickListInsert()函数将当前任务插⼊到节拍列表进⾏管理,如果OS_TickListInsert() 函数将当前任务插⼊节拍列表成功的话,就会调⽤OS_RdyListRemove() 函数将当前任务从任务就绪列表中移除,并将系统切换⾄其他任务,等到延时的时间到来,再根据优先级决定是否将CPU使⽤权分配给该任务。

这就是OSTimeDly() 函数实现任务延时的⼤致过程。

OSTimeDlyHMSM()OSTimeDlyHMSM() 函数与OSTimeDly() 函数的功能类似,也是⽤于停⽌当前任务进⾏的运⾏,延时⼀段时间后再运⾏,只是OSTimeDlyHMSM()函数⽐较于OSTimeDly()的定时格式不⼀样⽽已。

但是,⽤户若要使⽤OSTimeDlyHMSM() 函数,得事先将宏OS_CFG_TIME_DLY_HMSM_EN(位于“os_cfg.h”)设为1。

OSTimeDlyHMSM () 函数的信息如下表所⽰。

OSTimeDlyHMSM() 函数中,如果函数的实参和调⽤场合均合法,就会调⽤OS_TickListInsert() 函数将当前任务插⼊到节拍列表进⾏管理。

如果OSTimeDlyHMSM() 函数调⽤OS_TickListInsert() 函数将当前任务插⼊节拍列表成功的话,就会调⽤OS_RdyListRemove() 函数将当前任务从任务就绪列表中移除,并将系统切换⾄其他任务。

UCOSIII

UCOSIII

UCOSIII代码临界区CPU_SR_ALLOC()OS_CRITICAL_ENTER()OS_CRITICAL_EXIT()延时OSTimeDly()OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&er r)OSTimeDlyResume()钩子函数void App_OS_IdleT askHook (void)在空闲任务的钩子函数 OSIdleTaskHook()中不能出现可以让空闲任务进入等待态的代码!创建删除函数OSTaskCreate()OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err)挂起恢复任务OSTaskSuspend()OSTaskResume()时间片轮转调度OSSchedRoundRobinCfg(DEF_ENABLED,1,&err) 时间片轮转调度初始化void OSSchedRoundRobinYield (OS_ERR *p_err) 放弃时间片中断函数OSIntEnter() 进入中断时放在最前面OSIntExit() 放在中断函数最下面,用于退出中断时做一次任务切换定时器OSTmrCreate()OSTmrStart()OSTmrStop()在定时器的回调函数里面一定要注意避免使用任何可以阻塞或者删除掉定时器任务的函数!信号量OSSemCreate() 创建一个信号量OSSemDel() 删除一个信号量OSSemPend() 等待一个信号量OSSemPost() 释放一个信号量OSSemPendAbort() 取消等待OSSemSet() 强制设置一个信号量的值互斥信号量(解决优先级反转)OSMutexCreate() 创建一个互斥信号量OSMutexDel() 删除一个互斥型信号量OSMutexPend() 等待一个互斥型信号量OSMutexPost() 释放一个互斥型信号量OSMutexPendAbort() 取消等待只有任务才能使用互斥信号量(中断服务程序则不可以)任务内建信号量OSTaskSemPend() 等待任务信号量OSTaskSemPost() 发布任务信号量OSTaskSemPendAbort() 取消等待任务信号量OSTaskSemSet() 强行设置任务信号量计数消息队列OSQCreate() 创建一个消息队列OSQDel() 删除一个消息队列OSQFlush() 清空一个消息队列OSQPend() 等待消息队列OSQPendAbort() 取消等待消息队列OSQPost() 向消息队列发送一条消息中断服务程序只能使用 OSQPost()函数!内建消息队列OSTaskQPend() 等待消息OSTaskQPost() 向任务发送一条消息OSTaskQPendAbort() 取消等待消息OSTaskQFlush() 清空任务的消息队列ISR只能OSTaskQPost()!同时请求多个内建对象UCOSIII 中只支持同时等待多个信号量和消息队列,不支持同时等待多个事件标志组和互斥信号量OSPendMulti()。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任务堆栈:存储任务中的调用的函数、局部变量、中断服务程序和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,&e rr);中断中使用OSIntEnter();和OSIntExit();是为了退出中断后执行中断调度操作,如果中断中并未用到OSSemPost();等系统函数,则退出中断服务程序后不需要进行任务调度,就可以不在中断服务程序中使用OSIntEnter(); 和OSIntExit();。

(有时候用:CPU_CRITICAL_ENTER();OSIntNestingCtr++; CPU_CRITICAL_EXIT();替代OSIntEnter();)一、变量类型在中是有关cpu变量的重新定义,还包括CPU_STK(CPU 堆栈类型),和CPU_STK_SIZE(CPU堆栈类型的大小)的定义,CPU_SR (CPU状态寄存器的定义)。

在中是有关os类型的定义如OS_TCB(任务控制块)、OS_SEM(信号量)、OS_MUTEX(互斥型信号量)、OS_MSG (消息)、OS_Q(消息队列)、OS_ERR(系统错误)等。

在中是有关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的使用率(0—10000= )OSStatTaskCPUUsageMax:CPU的使用率最大值(0—10000= )OSTaskCtxSwCtr:任务切换次数的记录变量OSStatTaskCtr:已经建立了的任务数三、常用函数一、(1)void OSInit() (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() //空闲任务二、(1)void OSTaskCreate(OS_TCB *p_tcb,//任务控制块CPU_CHAR * p_name,//任务名OS_TASK_PTRp_task,//任务函数指针void*p_arg,//任务函数参数OS_PRIOprio,//任务优先级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)voidOSTaskDel() //任务的删除(4)voidOSTaskSuspend() //任务的暂停(5)void OSTaskResume() //任务的恢复(6)voidOSTaskStkChk()//校核空余内存的数量(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=1024B static CPU_STKTaskMainStk[TASK_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 *)&TaskMainStk[0] //任务的堆栈(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);//任务的错误信息三、(1)void OSTimeDly() //以时钟节拍数为单位延时(2)void OSTimeDlyHMSM() //用时、分、秒、毫秒为单位延时(3)void OSTimeDlyResume() //取消任务中的延时,引发一次调度(4)OS_TICKOSTimeGet() //获取OSTime 值(5)void OSTimeSet() //设置OSTime 值四、(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(&AppSem,"Test Sem", 0, &err);//要在使用之前创建(如果在两个任务中都用到,则最好在两个任务创建前建立,也可在优先级高的任务中建立)OSSemPend(&AppSem,0,OS_OPT_PEND_BLOCKING,&ts,&er r); //等待信号量(ts为发送信号量的时间戳)OSSemPost(&AppSem, OS_OPT_POST_1,&err);//发送信号量五、(1)void OSFlagCreate() //信号标志组的创建函数(2)OS_OBJ_QTY OSFlagDel() //删除信号标志组(3)OS_FLAGS OSFlagPend() //挂起信号标志组(4)OS_FLAGS OSFlagPost() //向信号标志组发送信号(5)OS_OBJ_QTYOSFlagPendAbort() //取消挂起信号标志组staticOS_FLAG_GRP AppFlag; //定义一个信号标志组变量CPU_TSts=0; //存放发送消息时的时间戳OS_TS_GET(); (获取当前时间戳)OS_ERRerr; //返回的错误信息OSFlagCreate(&AppFlag,"TestFlag",0x00,&err);//创建信号标志组且设置初值为0x00OSFlagPend(&AppFlag,0x03,0,OS_OPT_PEND_FLAG_SET_ ALL,&ts,&err);//等待信号标志组的bit0、bit1都为1 OSFlagPost(&AppFlag,0x01,OS_OPT_POST_FLAG_SET,&e rr); //把信号标志组的bit0设置为1六、(1)void OSMutexCreate() //创建互斥型信号量(2)OS_OBJ_QTY OSMutexDel() //删除互斥型信号量(3)void OSMutexPend() //请求互斥型信号量(4)void OSMutexPost() //发送(释放)互斥型信号量(5)OS_OBJ_QTYOSMutexPendAbort() //取消互斥型信号量static OS_MUTEX AppMutex; //定义一个互斥型信号量变量CPU_TS ts=0; //存放发送消息时的时间戳OS_TS_GET();(获取当前时间戳)OS_ERR err; //返回的错误信息OSMutexCreate(&AppMutex,"Test Mutex", &err);//创建互斥型信号量OSMutexPend(&AppMutex, 0,OS_OPT_PEND_BLOCKING,&ts,&err);//互斥型信号量申请(阻塞方式)OSMutexPost(&AppMutex, OS_OPT_POST_NONE,&err); //互斥型信号量释放七、(1)void OSQCreate() //创建一个消息队列(2)OS_OBJ_QTY OSQDel() //删除消息队列(3)OS_MSG_QTY OSQFlush() //清空消息队列(4)void *OSQPend() //请求一个消息队列(6)void OSQPost() //向消息队列发送消息(6)OS_OBJ_QTYOSQPendAbort() //取消消息队列的等待状态以指针和长度的形式向其他任务发送消息,如果是阻塞方式则接收到的数据的次数等于发送的次数才会被阻塞。

相关文档
最新文档