uC/OS-II已经自学了多遍,但是如何将前后台程序移植到uC/OS-II 感觉不适应,划分任务真
uC/OS-II中,任务无非有三种类型:(1)、单次执行的任务
此类任务在创建后只执行一次,执行结束后即自行删除
voidMyTask (void *pdata) //单次执行的任务函数
{
进行准备工作的代码;
任务实体代码;
调用任务删除函数; //调用 OSTaskDel(OS_PRIO_SELF)
}
(2)、周期性执行任务
此类任务在创建后按一个固定的周期来执行,其任务函数的结构如下:
voidMyTask (void *pdata) //周期性执行的任务函数
{
进行准备工作的代码;
for (;;) //无限循环,也可用 while (1)
{
任务实体代码;
调用系统延时函数;//调用 OSTimeDly( )或 OSTimeDlyHMSM( )
}
}
(3)、事件触发执行的任务
相关事件发生一次,该任务实体代码就执行一次,故该类型任务称为事件触发执行的任务,其任务函数的结构如下
voidMyTask (void *pdata) //事件触发执行的任务函数
{
进行准备工作的代码;
for (;;) //无限循环,也可用 while (1)
{
调用获取事件的函数;//如:等待信号量、等待邮箱中的消息等等。
任务实体代码;
}
}
我原先一直使用前后台模式编程,但是想把前后台中程序的设计方法移植到ucos-II下感觉很难, 在此请教大家:
(a)、显示任务
在前后台中,有一段显示程序,负责显示数码管和指示灯。
(a.1)仪表上电自检过程中,依次检查仪表上的每个数码管是否正常,依次检查仪表上的每个指示灯是否正常,然后显示版本号
采用的方法是每隔500毫秒,仪表上的指示灯依次点亮,
每隔500毫秒,仪表上的数码管依次显示“0”
每隔500毫秒,仪表上的数码管依次显示“1”
每隔500毫秒,仪表上的数码管依次显示“2”
。。。。。。。。。。。。。
每隔500毫秒,仪表上的数码管依次显示“9”
最后显示版本号,同时版本号显示停留时间=3秒
(a.2)仪表正常工作时,数码管显示测量数据,指示灯根据程序处理决定是点亮或者熄灭
当使用uC/OS-II时,如何编写显示任务呢?
voidDisplayTask (void *pdata)
{
BOOL post_mark = TRUE;// 上电自检标志
while (1)
{
if (post_mark) // 如果上电自检
{
指示灯全亮;
OSTimeDly(500ms);
数码管全部显示“0”;
OSTimeDly(500ms);
数码管全部显示“1”;
OSTimeDly(500ms);
数码管全部显示“2”;
OSTimeDly(500ms);
数码管全部显示“3”;
OSTimeDly(500ms);
....
....
数码管全部显示“9”;
OSTimeDly(500ms);
数码管显示“版本号”;
OSTimeDly(500ms);
post_mark = FALSE;// 清除上电自检标志
}
else // 自检完毕后,显示测量数据
{
指示灯根据程序处理点亮或者熄灭;
数码管显示“测量数据”;
OSTimeDly(500ms);
}
}
} voidMyTask (void *pdata) //周期性执行的任务函数
{
进行准备工作的代码;(放这里不可以吗)
for (;;) //无限循环,也可用 while (1)
{
任务实体代码;
调用系统延时函数;//调用 OSTimeDly( )或 OSTimeDlyHMSM( )
}
} 你这个显示任务没有必要分开,做成1个任务即可,这个任务开始部分就是 自检,然后就是死循环显示。
不要为了任务而任务。呵呵。个人建议。 改写成如下形式是否可行?
voidDisplayTask (void *pdata)
{
指示灯全亮;
OSTimeDly(500ms);
数码管全部显示“0”;
OSTimeDly(500ms);
数码管全部显示“1”;
OSTimeDly(500ms);
数码管全部显示“2”;
OSTimeDly(500ms);
数码管全部显示“3”;
OSTimeDly(500ms);
....
....
数码管全部显示“9”;
OSTimeDly(500ms);
数码管显示“版本号”;
OSTimeDly(3000ms);
while (1)
{
指示灯根据程序处理点亮或者熄灭;
数码管显示“测量数据”;
OSTimeDly(500ms);
}
} 一个任务就可以了,楼主试试。 刚开始学UCOS,搞得很郁闷啊,在网上下了个说已经移植好,按资料改了下,我加上我的任务,死活不行。 这都是啥和啥啊
struct _action
{
void (*action)();
int delay;
} action[] =
{
{..., ...},
...
}:
void thread_entry(void* parameter)
{
int index;
for (index = 0; index < sizeof(action)/sizeof(action); index ++)
{
action.action();
rt_thread_delay(action.delay);
}
...
while (1) ...
} MARK 唉,我也在纠结。。。
网上这方面的资料太欠缺了。。
中国这么多高手,就是没有一个高手愿意在网上放一点这方面的教程。。
高手都很忙的。。 mark 实用,mark mark
过阵子就要移植+写编码了,头大... mark Mark,也在考虑安排任务,学习 怎么做呢 。。。 mark 我感觉显示就专门做一个任务display 他只管显示 用*pdata传给他要显示的内容就行~ 开机自检则用一个专门的任务 每次给这个显示任务发送你要的1234什么的 自检完毕之后用OSTaskDelReq(OS_PRIO_SELF)把自己干掉,这样的好处是可以释放内存 只是建议哦 请大家多多指教 顶顶顶顶 偶记得任哲老师的一本书上专门讲怎么划分和安排任务,用的也是UCOS,大家可以看看! 不过我和楼主现在的状况一样,前后台模式已经用了三年了,ucos还有FREERTOS都看了很多遍了,就是还没项目上用过,所以具体也是不知道怎么划分 MARK 划分任务没有那么复杂,怎么做都可以,逻辑上行得通就好了。
哎,同样啊
在网上找了个c51f340的移植上了,想把原来的前后台工作换过来,周期性和运行一次的好写。可是到触发的就不知道该怎么下手了。 MARK{:sad:} ffxz 发表于 2010-12-20 17:01 static/image/common/back.gif
这都是啥和啥啊
struct _action
还是您的代码高级啊!
页:
[1]