嵌入式系统学习——STM32之UCOS-III事件标志组和存储管理
来源:互联网 发布:windows 10开机扬声器 编辑:程序博客网 时间:2024/05/14 17:05
事件标志组:
有时候一个任务需要与多个事件同步,这个时候就需要使用事件标志组。事件标志组与任务之间有两种同步机制:“或”同步和“与”同步。
“或”同步:等待多个事件时,任何一个事件发生 ,任务都被同步,这个就称为“或”同步。
“与”同步:当所有的事件都发生时任务才被同步,这种同步机制被称为“与”同步。
在UCOSIII中事件标志组为OS_FLAG_GRP,如果需要使用事件标志组的时候需要将宏OS_CFG_FLAG_EN置1,
struct os_flag_grp {OS_OBJ_TYPE Type; CPU_CHAR *NamePtr; OS_PEND_LIST PendList; #if OS_CFG_DBG_EN > 0u OS_FLAG_GRP *DbgPrevPtr; OS_FLAG_GRP *DbgNextPtr; CPU_CHAR *DbgNamePtr;#endifOS_FLAGS Flags; CPU_TS TS;};
事件标志组API函数:
函数名 作用
OSFlagCreate() 创建事件标志组
OSFlagDel() 删除事件标志组
OSFlagPend() 等待事件标志组
OSFlagPendAbort() 取消等待事件标志
OSFlagPendGetFlagsRdy() 获取使任务就绪的事件标志
OSFlagPost() 向事件标志组发布标志
同时等待多个内核对象:
前面我们讲过都是等待单个内核对象,包括:信号量、互斥信号量、消息队列和事件标志组。在UCOSIII中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOSIII不支持同时等待多个事件标志组或互斥信号量。
一个任务可以等待任意数量的信号量和消息队列,第一个信号量或消息队列的发布会导致该任务进入就绪态。
OSPendMulti()函数:
一个任务可以调用函数OSPendMulti()函数来等待多个对象,并且可以根据需要指定一个等待超时值,函数OSPendMulti()原型如下:
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl, OS_OBJ_QTY tbl_size, OS_TICK timeout, OS_OPT opt, OS_ERR *p_err)在调用函数OSPendMulti()之前我们需要先初始化OS_PEND_DATA数组,数组的大小取决于任务同时等待的内核对象的总数量。
初始化OS_PEND_DATA数组:
1、定义内核对象,如下:OS_SEMTest_Sem1;//信号量1OS_SEMTest_Sem2;//信号量2OS_QTest_Q;//消息队列2、初始化OS_PEND_DATA数组
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM]; //定义数组pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;
存储管理:
作为一个RTOS操作系统,内存管理是必备的功能,因此UCOSIII也就内存管理能力。通常应用程序可以调用ANSI C编译器的malloc()和free()函数来动态的分配和释放内存,但是在嵌入式事实操作系统中最好不要这么做,多次这样的操作会把原来很大的一块连续存储区域逐渐地分割成许多非常小并且彼此不相邻的存储区域,这就是存储碎片。
UCOSIII中提供了一种替代malloc()和free()函数的方法,UCOSIII中将存储空间分成区和块,每个存储区有数量不等大小相同的存储块,在一个系统中可以有多个存储区。
一般存储区是固定的,在程序中可以用数组来表示一个存储区,比如u8 buffer[20][10],就表示一个拥有20个存储块,每个存储块10个字节的存储区。
存储控制块:
UCOSIII中用存储控制块来表示存储区,存储控制块为OS_MEM。
struct os_mem {OS_OBJ_TYPE Type; void *AddrPtr; CPU_CHAR *NamePtr;void *FreeListPtr; OS_MEM_SIZE BlkSize; OS_MEM_QTY NbrMax; OS_MEM_QTY NbrFree; #if OS_CFG_DBG_EN > 0u OS_MEM *DbgPrevPtr; OS_MEM *DbgNextPtr;#endif};
存储管理相关API函数:
函数名 作用
OSMemCreate() 创建一个存储分区
OSMemGet() 从存储分区中获得一个存储块
OSMemPut() 将一个存储块归还到存储分区中
OSMemCreate() 创建一个存储分区
OSMemGet() 从存储分区中获得一个存储块
OSMemPut() 将一个存储块归还到存储分区中
参考:开源电子网 STM32中文参考手册
阅读全文
0 0
- 嵌入式系统学习——STM32之UCOS-III事件标志组和存储管理
- 嵌入式系统学习——STM32之UCOS-III中断和时间管理及软件定时器
- 嵌入式系统学习——STM32之UCOS-III任务管理
- 嵌入式系统学习——STM32之UCOS-III信号量和互斥信号量
- 嵌入式系统学习——STM32之UCOS-III任务基础API、时间片轮转调度和系统任务
- 嵌入式系统学习——STM32之UCOS-III消息传递
- 嵌入式系统学习——STM32之RTOS系统UCOS介绍与移植
- uCOS学习笔记(四)——事件标志组
- STM32学习之:事件标志组
- UCOS事件标志组管理笔记
- ucos-iii学习之任务管理
- ucos-iii学习之内部任务管理
- ucos-iii学习之中断管理
- ucos-iii学习之时间管理
- ucos-iii学习之软件定时器管理
- ucos-iii学习之系统内部任务
- uC/OS-III之事件标志组
- ucos iii学习笔记——为什么选择ucos iii
- Visual Studio SDK介绍
- 中位数
- CMake 指定gcc编译版本
- Android-广播接收者:发送有序广播
- el表达式跟ognl表达式的区别(用法和页面取值)
- 嵌入式系统学习——STM32之UCOS-III事件标志组和存储管理
- ConsumerCoordinator分析
- 正则表达式全部符号
- 委托初体验
- word使用技巧---插入图片显示不全的解决方案
- 安卓仿IOS删除抖动动画
- mysql主从复制(五)
- Java 驼峰命名法
- Partitioning by Palindromes UVA