当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]最近项目开发需要用到ucos,之前有听说过,但没用过,之前一直从事的与Linux相关的开发工作,基于应用的学习,所以本文偏向于应用的认知,只具备以下的认知即可进行开发啦,OS,其实都差不多。    本文只是个人学习ucos的理解,也参考了邵贝贝老师以及其它网

最近项目开发需要用到ucos,之前有听说过,但没用过,之前一直从事的与Linux相关的开发工作,基于应用的学习,所以本文偏向于应用的认知,只具备以下的认知即可进行开发啦,OS,其实都差不多。

   本文只是个人学习ucos的理解,也参考了邵贝贝老师以及其它网站上的学习教程。

内核调度的方法:时间片轮洵、优先级调度

不可剥夺性内核与可剥夺性内核的含义:

(1)不可剥夺性内核的好处就是只要这个任务不主动放弃CPU,那么别的任务是不能被抢夺的。

(2)可剥夺性内核对于一个优先级较低的来说,它的实时性可能不是很好,但是对于一个优先级较高的来说,它的实时性是相当好的,只要这个任务需要执行,他就会立马执行,这个就是可剥夺性内核。

Ucos属于优先级调度====>可剥夺性内核,数字越小,优先级越大。

专业术语

(1)代码的临界段

指处理时不可分割的代码。一旦这段代码开始执行,不允许中断的打入。

在进入临界段代码之前,需要关中断,执行完临界段代码,开中断。

(2)资源和共享资源

资源:任何为任务所占用的实体。如:打印机,键盘,显示器等。另外资源也可以是一个变量,一个结构或者一个数组。

共享资源:被一个以上的任务使用的资源。

如果要使用共享资源,必须满足互斥:(独占)

满足互斥的方法如下:

1、  关中断和开中断

在使用这个全局变量或者共享资源之前呢,我们首先把这个中断给关掉,当共享资源使用完毕以后,我们再把这个中断给打开就行了

2、  使用测试并置位指令

3、  任务禁止切换,使用,允许任务切换

不被任务打断,意味着不会被别的任务打断,这时就可以使用共享资源,使用完再开启任务切换。

4、  使用信号量

方法与使用测试并置位指令类似,但注意使用共享资源,首先要获取这个信号量,获取后才能使用共享资源,使用完以后,需要释放信号量。

(3)死锁

死锁也称为抱死。指2个任务无限期的互相等待对方控制的资源。

简单的说就是两个任务分别都有它们相互的共享资源,一个任务在执行的过程中必须等待这个共享资源,而这个资源又正在另外一个任务利用,另外一个也是出现一样的情况。我等你,你等我,但最后谁都无法等待谁。

(4)UCOS任务间的同步

1、信号量

最简单的理解就是全局变量的置位,一个任务设置一个全局变量,而另一个任务不断检测这个变量,如果是想要的那个结果,那么就响应,但信号量和全局变量置位的方式不大一样,信号量是可控的。

2、互斥信号量

最简单的理解就是一个任务使用资源,另外一个不能使用,这就构成了互斥关系,必须等待资源使用完了,才能给下一个任务使用。

3、事件标志组

多任务同步的手段,比如当我们使用组合按键去响应多个任务的时候就会用到。

(5)任务间通信

1、消息邮箱

数据交互的过程,一个任务负责把消息推送出去,其它的任务就负责去接收这个消息,消息可以各种数据类型组成的数据,并且,基于邮箱的特点,两个任务之间是可以不断进行收发的。

2、消息队列

就是多个消息邮箱构成的队列。

(6)中断

中断执行的时间越短越好,越长则会影响程序的实时性。

进入中断函数:OS-IntEnter();

退出中断函数:OS-IntExit();

中断计数器:ISRCounter,相当于引用计数,来一个中断就加一,中断退出的时候就减一。

(7)时钟节拍

其实就是由硬件实现的,类似单片机的晶振产生的频率。

(8)使用步骤

1、初始化OS  OS_Init();

2、创建任务   OSTaskCreate或者OSTaskCreateExt

3、执行OS    OS_Start();


任务相关的函数

建立任务函数

OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio);

参数:

task:指向任务函数的函数指针
pdata:给任务的参数指针
ptos:是分配给任务的堆栈的栈顶指针
prio:任务优先级

INT8U OSTaskCreateExt (void (*task)(void *p_arg),  void *p_arg,
OS_STK *ptos, INT8U prio,
INT16U id, OS_STK *pbos,
INT32U stk_size,  void *pext,

INT16U opt);

参数:
task:指向任务函数的函数指针
pdata:给任务的参数指针
ptos:是分配给任务的堆栈的栈顶指针
prio:任务优先级
id:任务ID号,范围0-65535
pbos:任务堆栈的栈底指针
stk_size:任务堆栈大小
pext:用户补充存储区,对TCB的扩充,不用设置为0
opt:任务选项,有三个,分别为:OS_TASK_OPT_STK_CHK、OS_TASK_OPT_STK_CLR 和 OS_TASK_OPT_SAVE_FP
 表示检查任务堆栈、任务堆栈清零和保存浮点(FPU)寄存器。
 
任务删除:其实是把任务置于睡眠状态,并不是把任务代码给删除了
INT8U OSTaskDel(INT8U prio);
prio:任务的优先级

请求任务删除  
INT8U OSTaskDelReq(INT8U prio);

改变任务优先级
INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio);

任务挂起和恢复
INT8U OSTaskSuspend(INT8U prio);

INT8U OSTaskResume(INT8U prio);


两个事件之间的通讯是基于一个模型:
任务1 ===> 发送事件       <=====请求事件<====任务2 


事件控制块结构

typedef struct
{
INT8U OSEventType; //事件的类型
INT16U OSEventCnt;  //信号量计数器
void *OSEventPtr; //消息或消息队列的指针
INT8U OSEventGrp;  //等待事件的任务组
INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表
#if OS_EVENT_NAME_EN > 0u
INT8U *OSEventName; //事件名
#endif
} OS_EVENT;


信号量:
对应事件控制块结构的事件类型为OS_EVENT_TYPE_SEM

1、创建信号量
OS_EVENT *OSSemCreate (INT16U cnt);
cnt:信号量计数器的初始值
return:返回值为已经创建的信号量的指针

2、请求信号量函数
void OSSemPend ( OS_EVENT *pevent, INT16U timeout, INT8U *err);
pevent:被请求信号量的指针
timeout:等待时限
err:错误信息

3、发送信号量函数(释放信号量)
INT8U OSSemPost(OS_EVENT *pevent);
pevent:信号量指针
return:成功返回值为OS_ON_ERR,否则会根据错误类型返回OS_ERR_EVENT_TYPE、OS_SEM_OVF

4、删除信号量函数
OS_EVENT *OSSemDel (OS_EVENT *pevent,INT8U opt, INT8U *err);
pevent:要删除的信号量指针
opt:删除条件选项
err:错误信息


邮箱:
任务与任务之间传递数据的方式。
对应事件控制块结构的事件类型为OS_EVENT_TYPE_MBOX

1、创建邮箱函数
OS_EVENT *OSMboxCreate (void *msg);
msg:消息指针
return:返回值为消息邮箱的指针。
使用: OS_EVENT *msg_ptr = NULL ;
 u8 *msg_string = "hello world" ;
 msg_ptr = OSMboxCreate(msg_string);

2、向邮箱发送消息的函数
INT8U OSMboxPost (OS_EVENT *pevent,void *msg);
pevent:消息邮箱的指针
msg:消息指针

3、请求邮箱指针
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
pevent:消息邮箱的指针
timeout:等待时限
err:错误信息


4、查询邮箱状态函数

INT8U OSMboxQuery(OS_EVENT *pevent,OS_MBOX_DATA *pdata);
pevent:消息邮箱指针
pdata:存放邮箱信息的结构

5、删除邮箱函数
OS_EVENT *OSMboxDel(OS_EVENT *pevent,INT8U opt,INT8U *err);
pevent:消息邮箱指针
opt:删除选项

err:错误信息

暂时就这样吧,后面用到了再加进来。

参考:

1、邵贝贝老师的书籍。

2、麦子学院ucos wiki教程:http://www.maiziedu.com/wiki/iot/ucoskernel/


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭