uCOS-III基础入门函数
admin
2024-01-30 16:02:52
0

uCOS-III是一个主要是运行在单片机上操作系统,可以实现并发,主要的功能就是任务、mutex、event的创建和使用。

调度器

调度器就是使用相关算法来决定当前需要执行的任务,调度器的核心有两个,一是调度算法,二是任务切换

不同系统之间的任务切换都是差不多的,而调度算法却不一样,FreeRTOS和uCOS的调度算法就不一样。

合作式调度器

FreeRTOS支持合作式调度

抢占式调度器

如果使用抢占式调度,最高优先级的任务一旦准备就绪,总能得到CPU的控制权,当一个运行着的任务使一个优先级比他高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,高优先级的任务立即得到CPU控制权。学习抢占式调度最重要的一点就是 : 优先级

时间片调度器

最常用的时间片调度算法是round-robin调度算法,实现round-robin算法需要给同优先级的任务之间分配一个专门的列表,用于记录当前就绪的任务,还需要给每个任务一个时间片。目前FreeRTOS和uCOS-III都支持round-robin算法。

任务创建和删除任务

OSTaskCreate()函数

void  OSTaskCreate (OS_TCB        *p_tcb,//p_tcb: 指向任务控制块 OS_TCB//TCB: Task Controller Block//在ucos中用结构体OS_TCB来保存一个任务的所有信息CPU_CHAR      *p_name,//"字符串",指定任务的个性化的名字,如,“sb250”OS_TASK_PTR    p_task,//p_task 函数指针,指向任务的“任务函数”void          *p_arg,//指针,指向的对象,将作为“任务函数”的参数传入OS_PRIO        prio,//priority 任务级//指定任务的优先级 "unsigned char"//数字越小,优先级就越高// [2, OS_CFG_PRIO_MAX - 2]//STK: stack//如下三个参数用来描述“任务栈”: stack//"栈内存":用来保存任务执行过程中的一些参数,局部变量等等//每个任务都需要有一个独立的栈空间!!!//一般来说,定义一个全局的数组,用来当作任务的栈空间CPU_STK       *p_stk_base,//p_stk_base指向任务栈的基址,任务栈数组的首地址//任务栈数组的元素类型必须为  CPU_STK(CPU_INT32U)CPU_STK_SIZE   stk_limit,//设置一个 任务栈的 下限值//栈中剩余多少元素时“报警”CPU_STK_SIZE   stk_size,//指定任务栈中最多的元素个数(不是字节数)OS_MSG_QTY     q_size,//指定任务内部消息队列的最大消息数//ucos会为每个任务在内核中创建一个消息队列,用于IPCOS_TICK        time_quanta,//tick: SysTick 时钟嘀哒//指定该任务的时间片的长度,以时钟嘀哒为单位//如: SysTick频率为  1000HZ//   1s内时钟中断产生 1000次// => 每隔1ms产生一个 SysTick的时钟中断// 这个时钟中断的间隔,称为“Tick 时钟嘀哒”// 时间片的长度为 : time_quanta * 1ms// os_cfg_app.h#define  OS_CFG_TICK_RATE_HZ   1000u   /* Tick rate in Hertz (10 to 1000 Hz)    void          *p_ext,//指向用户补充的内存区,如:在栈越界的时候,可以用OS_OPT         opt,//包含任务的特定的选项,位域,可以或:// //如://  OS_OPT_TASK_NONE            No option selected  // OS_OPT_TASK_STK_CHK         Stack checking to be allowed for the task//  OS_OPT_TASK_STK_CLR         Clear the stack when     //  /// ...                            OS_ERR        *p_err//p_err指针,用来保存出错信息// OS_ERR_NONE 表示成功// 其他值,表示失败)

OSTaskDel函数

删除任务,函数原型非常简单,只需要知道被删除任务的任务控制块就行了。

#if OS_CFG_TASK_DEL_EN > 0u
void  OSTaskDel (OS_TCB  *p_tcb,OS_ERR  *p_err)

使用OSTaskDel删除一个任务的时候,这个任务的堆栈、tcb占用的内存并没有释放掉,我们可以利用他们用于其他任务

任务挂起和恢复实验

OSTaskSuspend()函数

suspend:暂停

#if OS_CFG_TASK_SUSPEND_EN > 0u
void   OSTaskSuspend (OS_TCB  *p_tcb,OS_ERR  *p_err)

有时候有些任务由于某些原因需要暂停运行,但是以后还要运行,因此我们不能删除任务,这里可以使用OSTaksSuspend挂起任务,以后再恢复运行。

我们可以多次调用OSTaksSuspend来挂起一个任务,因此我们需要调用同样次数的OSTaskResume才可以恢复被挂起的任务,这一点特别重要。

OSTaskResume()函数

resume:恢复

#if OS_CFG_TASK_SUSPEND_EN > 0u
void  OSTaskResume (OS_TCB  *p_tcb,OS_ERR  *p_err)

OSTaskResume用来恢复被OSTaskSuspend函数挂起的任务,OSTaskResume是唯一能恢复被挂起任务的函数。

时间管理函数

OSTimeDly函数

void  OSTimeDly (OS_TICK   dly,OS_OPT    opt,OS_ERR   *p_err)

延时函数,延时会主动放弃CPU的执行权。

OSTimeDlyHMSM()函数

#if OS_CFG_TIME_DLY_HMSM_EN > 0u
void  OSTimeDlyHMSM (CPU_INT16U   hours,CPU_INT16U   minutes,CPU_INT16U   seconds,CPU_INT32U   milli,OS_OPT       opt,OS_ERR      *p_err)

opt可以设置为严格或者非严格的。

OSTimeDlyResume()函数

一个任务可以通过调用这个函数来解救那些因为调用了 OSTimeDly或者OSTimeDlyHMSM而进入等待状态的任务。

#if OS_CFG_TIME_DLY_RESUME_EN > 0u
void  OSTimeDlyResume (OS_TCB  *p_tcb,OS_ERR  *p_err)

OSTimeGet 和 OSTimeSet函数

void  OSTimeSet (OS_TICK   ticks,OS_ERR   *p_err)OS_TICK  OSTimeGet (OS_ERR  *p_err)

用来获取和设置当前计数器时钟节拍数的值。

互斥信号量

uCOS-III会改变任务的优先级。

可以嵌套使用中断信号量(最多250次),当然也需要释放同样的次数才能真正的释放这个信号量。

创建互斥型信号量

OSMutexCreate()函数

void  OSMutexCreate (OS_MUTEX  *p_mutex,CPU_CHAR  *p_name,OS_ERR    *p_err)

请求互斥型信号量

OSMutexPend()函数

pend:有阻塞的意思,suspend是挂起。挂起是一种主动行为,阻塞是一种被动行为。

这里OSMutexPend是等待一个互斥信号量,如果该信号量被占用的话则一直阻塞,知道信号量被释放或者到达超时时间了。

注意:如果占用该互斥信号量的任务比当前申请该互斥信号量的任务的优先级低的话,OSMutexPend函数会将占用该互斥信号量的任务的优先级提升到和当前申请该信号的任务的优先级一样,当任务释放掉该信号量后,优先级恢复到和之前一样。

void  OSMutexPend (OS_MUTEX  *p_mutex,OS_TICK    timeout,OS_OPT     opt,CPU_TS    *p_ts,OS_ERR    *p_err)

opt可以选择是否使用阻塞模式。p_ts是一个时间戳。

释放互斥信号量

OSMutexPost()函数

void  OSMutexPost (OS_MUTEX  *p_mutex,OS_OPT     opt,OS_ERR    *p_err)

事件标志组

每个事件有两种状态: 0 或者 1,用一组连续的比特位表示一组事件。

事件标志组与任务之间有两种同步机制:“与”同步 和 “或”同步,当任意一个事件发生时进行同步的是或同步,当所有时间全部发生时才同步的是与同步。

创建事件标志组

OSFlagCreate()函数

void  OSFlagCreate (OS_FLAG_GRP  *p_grp,CPU_CHAR     *p_name,OS_FLAGS      flags,OS_ERR       *p_err)

创建一个事件标志组,指定名字p_name和初始状态flags。

等待事件标志组

OSFlagPend()函数

OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,OS_FLAGS      flags,OS_TICK       timeout,OS_OPT        opt,CPU_TS       *p_ts,OS_ERR       *p_err)

第一个参数指定要等待的事件标志组

第二个参数指定需要等待的事件,为 1 的位表示需要等待的事件

timeout表示等待的最大超时时间

opt:

OS_OPT_PEND_FLAG_CLR_ALL 等待所有的事件位为 0 (clear),这是与事件

OS_OPT_PEND_FLAG_CLR_ANY 等待任意时间位为 0 (clear) ,这是或事件

OS_OPT_PEND_FLAG_SET_ALL 等待所有事件位为1 (set) ,这是与事件

OS_OPT_PEND_FLAG_SET_ANY 等待任意事件位为1(set), 这是或事件

p_ts是一个时间戳。

设置事件组标志位

OSFlagPost()函数

OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,OS_FLAGS      flags,OS_OPT        opt,OS_ERR       *p_err)

第一个参数是要设置的事件标志组

第二个参数是需要设置事件位(可以有多个)

第三个参数为OS_OPT_POST_FLAG_SET或者OS_OPT_POST_FLAG_CLR

相关内容

热门资讯

黄力晨:不给格陵兰岛就加关税 ... 昨日周一我们认为,地缘风险集中发酵,以及对美联储年内降息2次的预期,依旧对金价形成重要支撑,因此操作...
AI给出的搜索结果,可信吗? 新华调查|AI给出的搜索结果,可信吗? 出门旅游住哪家酒店,咖啡机买哪个品牌,电动牙刷哪款好用……随...
国际金价看向5000美元? 来源:北京商报 国际金价和白银价格再创历史新高。1月19日盘中,伦敦金现价格一度涨超4690美元/盎...
镁信健康由40岁CEO张小栋持... 瑞财经 王敏 1月16日,上海镁信健康科技集团股份有限公司(以下简称“镁信健康”)在港交所递交招股书...
人民日报连续评“西贝关店”事件... 针对最近“西贝关店”事件,人民日报罕见连续发表了两篇评论性文章。 1月19日下午,“人民日报评论”微...
一图解码:港股IPO一周回顾 ... 过去一周(2026.1.12-1.18),港股IPO市场共有29家公司递交上市申请,包括钱大妈、袁记...
罚没8300万元、3年市场禁入... 7个月获利超4000万,“大V”专割粉丝“韭菜”。 1月19日,浙江证监局公布对知名财经“大V”金永...
1亿,名川资本第3期人民币基金... 文:韦亚军 摄影:Bob 名川资本主要投资A轮前后的初创企业,重点投资2B软件方向。 近日,名川资...
复宏汉霖:1.83亿股H股上市... 复宏汉霖(02696)发布公告,香港联合交易所已于2026年1月19日授予公司1.83亿股H股的上市...
和讯投顾杨德勇:缩量横盘后,涨... 自17连阳之后,在这已经横了5天了,那接下来这个 A股到底是往上还是往下? 和讯投顾杨德勇表示,我们...
关税恐慌再现!欧股重挫美股盘前... 受美国总统特朗普上周末威胁对丹麦、挪威、瑞典、法国、德国、荷兰、芬兰和英国八个欧洲盟国加征关税影响,...
银价飙涨令光伏行业腹背受敌,前... 旧伤未愈、又添新痛。供需仍严重失衡背景下,疯涨的白银和硅料价格令光伏企业腹背受敌,年报集体大额预亏,...
消费热潮席卷A股!零售板块集体... 本报(chinatimes.net.cn)记者谢碧鹭 北京报道 2026年开年以来,A股消费板块迎来...
1月20日每日研选 | A股行... A股成交额创历史新高后,市场进入量能冲高后的震荡调整阶段,板块轮动与资金博弈加剧。随着2026年春季...
和讯投顾许鑫:下午盘面大概率仍... 1月19日,和讯投顾许鑫表示,今天盘中若出现下砸,会有外资陆股通资金回流,进而呈现盘中下砸又盘中修复...
【最新政策】两部门发文延续实施... 财政部 税务总局 关于延续实施境外机构投资境内债券市场企业所得税、增值税政策的公告 财政部 税务总局...
受让方成立仅6天!上海国资超1... 来源:每日经济新闻 江化微(SH603078,股价21.42元,市值82.6亿元)1月19日晚间公...
昆明甲状腺医院:警惕“沉默的甲... 提到癌症,很多人会联想到疼痛、消瘦、乏力等明显症状,但甲状腺癌中,有相当一部分是“无症状”的——患者...
2025年四川“消费账单”出炉... 转自:四川日报 早上好,今天是1月20日,星期二,一天的信息更新,从川报一分钟早读开始。 昨日,一年...
国资入股地方中小银行战略意义非... 李凤文 今年以来,地方中小银行资本补充进程显著提速,监管层对多家银行注册资本变更的批复密集落地。宁夏...