发这个贴是看的以下这个贴有感而发的。
https://bbs.eeworld.com.cn/forum. ... hlight=%C7%B3%CC%B8
当中对时间片轮询法讲得很透彻,一个结构体加上数组将定时器中断发挥的很好,当中说到ucosii,提的很少,于是乎,我就想对使用ucosii说一些自己浅显的见解。
ucosii说到底,只是一种操作系统,失去底层硬件框架,也发挥不出它的好处,而现在我手头上只有stm32f1系列的单片机,并且运作正常,在此就将这个工程模板发出来,工程是自己建的,ucosii的移植是在网上拷贝的别人的,为什么不自己移植?看了任哲先生的那本讲ucosii的书,就想自己对单片机操作,移植太费时间,知道是怎么个道理就行,太在意了对自己也不好,无非就是些数据类型的定义啊,临界点啊,任务堆栈啊,系统HOOK()函数啊。。。。。不想一一去费解,想必在以后做项目的时候会一一了解的,一次不要吞大了,先不求甚解,工程如下,想要的朋友可以直接用,是stm32f1系列的工程。
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
说到对ucosii的简单粗暴的使用,怎么使用了,在此,还是要多嘴提一下,以前写裸机程序时,先初始化,然后无限循环,比如while(1),for(;;),这样的,一开始学习时,就说过程序不能停,这也是必须尊守的,哪怕是有一些时间的间断,也得用delay去隔开,让CPU去干耗着,而ucosii时对延时函数变成了任务调度用的了,让你延时,但是在延时这个时间段,cpu去做其他任务,任务这里提到了任务,就是无限循环,几个任务就是几个无限循环,相互之间通过两种延时函数去切换的,延时就是对CPU的释放,任务与任务之间是相互独立的,可以相互通信,相互对共同资源抢占,任务之间用任务优先级来区分,都有自己的堆栈区,这个我们可以开始不用管,反正知道cpu碰见延时函数就会跳到别的任务中去,怎么跳?哪个任务就绪,就绪中哪个任务优先级高就跳过去。这些自己上网查查就能很快了解的。
值得注意的是:每一个任务都得用延时函数来释放cpu,不要自己写延时函数,用它写好了的。要不然高任务不释放CPU,低任务无法执行!切记万万不可造成这种局面。
本帖最后由 ywlzh 于 2016-1-23 18:47 编辑
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
接下来说说任务间的通信,这个也是ucosii相对与其他操作系统的厉害的地方,据说,只是据说,有一些航天级的操作,个别部分就定制的ucosii操作系统。
1.信号量怎么用?
涉及到几条函数,假如我要创建一个信号量sin_sing,如下:
现在函数外定义:OS_EVENT * sinsing;
然后在函数中创建:sinsing=OSSemCreate(0);
这样就创建好了,需要注意的是在创建中是不能被中断打断的,怎么做呢?难道要在创建时加上OS_ENTER_CRITICAL();和OS_EXIT_CRITICAL();来划界,不用这样,直接在创建任务前去创建信号量就行,以下的互斥信号量,消息队列,都是这样的。
2信号量是用来干嘛的?
还记得以前裸机中,标志位 是用来干嘛的,那它就是来干嘛的,只不过有点不同的是它可以计数,具体简单实现如下:
发送信号量OSSemPost(sinsing);
每发送一次,信号量sinsing就会将它里面的计数器加一,这个函数可以在中断里用,可以在任务中用。
请求信号量 OSSemPend(sinsing,0,&err);
这句话是询问信号量是否为0,如果为0,就不会执行以下的程序(是因为第二参数0,意思就是如果信号量不为零,就等多久再去做接下来的程序,而第二参数为零,意思就是无限的等,管你是什么天王老子,等着!),单片机大多数对第二参数直接给0,意思很明了。err是需要自己定义一个数据,uint8_t的数据就行,它是这个函数的返回值,一般是不会在意这个err的,除非是需要返回值要用到它,不要,它就是个花瓶!信号量没求一次就会减一,如果没减完,就会释放完CPU后,再来请求的。
本帖最后由 ywlzh 于 2016-1-23 18:37 编辑
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
2.互斥型信号量
干嘛的?
是对资源的独占,为什么要对资源独占,各个任务共享不就行了?对,资源是共享的,但有时候也得用独占。比如说,有一个任务要用到串口发送一些数据,有另一个任务也得用串口发送数据,如果不独占,当低任务数据还没发完,而高任务抢占也要用串口发送,发送完了,低任务再接着发数据,最后数据不就乱套了吗,说一说要用到互斥型信号量。具体实现也很简单,上网一查,一大堆,值得注意的是,发送与请求是成对出现,先请求,将它变成0,在此期间,就算有高任务来抢占CPU,发现它为0,也会释放回来了,只有等资源用完了,再发送这个信号量,来告诉其他任务,我用完了,你们可以用了!
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
3,消息队列和消息邮箱,
就是用来存数据的,一个是一连串的数据,一个是单个字节,也有发送和请求,,不用成对出现。
4 ,中断
进中断是要写 OSIntEnter();用来对中断计数的,好像是这样的,反正要用就是,
出中断是要写OSIntExit();
中断程序的编写和裸机一样,举个例子:
void TIM1_TRG_COM_IRQHandler(void) //这个是TIM1的触发中断向量
{
OSIntEnter();
TIM1->SR &= 0x00; //清中断标志
//这里写下自己要在中断里想要做的事
OSIntExit();
}
懂了这些基本就能写了,开始自己写一个用ucosii的工程吧,还能美美的成就炫耀一把!哈哈
本帖最后由 ywlzh 于 2016-1-23 18:47 编辑
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
添加一些收集的资料,可以到时候翻翻,不需要每本都从头看到尾,遇到啥就看相应的部分,就把他当成是模块就可以了
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友