开启辅助访问 切换到窄版

打印 上一主题 下一主题

ucos基本概念学习和基本的使用

[复制链接]
作者:回归英灵 
版块:
嵌入式操作系统 其他嵌入式相关 发布时间:2018-7-9 19:58:50
16391
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近项目开发需要用到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、初始化OSOS_Init();

2、创建任务OSTaskCreate或者OSTaskCreateExt

3、执行OSOS_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 ===> 发送事件
回复

使用道具 举报

注册会员

积分
55
沙发
爱好者 发表于 2018-7-9 19:58:50 | 只看该作者
ucos在一些项目用了几年了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表