社区
单片机/工控 帖子详情 关于ucos中OSTimeDly()的问题 baiwan111 2010-08-19 03:26:04 我在主程序中的main函数建立的两个任务,程序是正常的,也跑起来了,但是有个问题不知道如何解决?
void main (void)
{
OSInit();
......
OSTaskCreate(Task, (void *)0, (void *)&TaskStk[0][0], 10);
OSTaskCreate(Task1, (void *)0, (void *)&TaskStk[1][0], 12);
......
OSStart();
}
void Task1(void *data)
{
UBYTE x1;
x1=x1;
for (;;) {
*LED0 =1;
OSTimeDly(3);
}
}
void Task (void *data)
{
for (;;) {
*LED0 =0;
OSTimeDly(3);
}
}
我想实现的是3个时钟led亮三个时钟灭的,但是实际上一直亮,用仿真器可以看到在延时的时候并没有进入task那个程序。
即使将第二个函数改为
void Task (void *data)
{
for (;;) {
*LED0 =0;
OSTimeDly(2);
}
}
也会出现一个问题,就是每当时基为6的倍数时,只执行第一个函数,请问该如何才能实现2个时钟和3个时钟的不间断切换?谢谢!
...全文
1031 12 打赏 收藏 关于ucos中OSTimeDly()的问题 我在主程序中的main函数建立的两个任务,程序是正常的,也跑起来了,但是有个问题不知道如何解决? void main (void) { OSInit(); ...... OSTaskCreate(Task, (void *)0, (void *)&TaskStk[0][0], 10); OSTaskCreate(Task1, (void *)0, (void *)&TaskStk[1][0], 12); ...... OSStart(); } void Task1(void *data) { U 复制链接
扫一扫 分享 转发到动态 举报
写回复 配置赞助广告取 消
确 定
用AI写文章 12 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 HKCID 2010-08-29 打赏举报 回复 [Quote=引用 8 楼 guetcw 的回复:]
你的系统节拍是多少,如果是100或者1000的话OSTimeDly(2),OSTimeDly(3)时间太短了,人眼根本分不出来,改成
OSTimeDly(OS_TICKS_PER_SEC/2); //延时1/2秒
OSTimeDly(OS_TICKS_PER_SEC/3); //延时1/3秒
或者更长一些
[/Quote]
是啊,OSTimeDly的参数加大点,然后缩小到合适的范围,应该倒过来,
任务权限高的延时时间越长。
而且实时系统,这样设置也不一定每次都“实现2个时钟和3个时钟的不间断切换",
说不定上百个轮回后某次是 2-4,3-4都有可能。
wackestar 2010-08-29 打赏举报 回复 你的系统一共有几个任务吧。是不是任务太多了。你的延时时间又太短,优先级还这么低。所以执行不到你的第二个任务。 jackwini 2010-08-26 打赏举报 回复 其实你这个还是有问题的,应该要考虑LED资源占用的问题,否则还是会出问题的 baiwan111 2010-08-26 打赏举报 回复 只是借助led说明一个问题而已,本意指的是对一个共享资源的操作!
[Quote=引用 7 楼 bluesea87 的回复:]
我感觉怎么写得挺便扭的,一个任务就可以完成的东西,为什么要在两个任务里做
[/Quote] guetcw 2010-08-25 打赏举报 回复 你的系统节拍是多少,如果是100或者1000的话OSTimeDly(2),OSTimeDly(3)时间太短了,人眼根本分不出来,改成
OSTimeDly(OS_TICKS_PER_SEC/2); //延时1/2秒
OSTimeDly(OS_TICKS_PER_SEC/3); //延时1/3秒
或者更长一些 bluesea87 2010-08-25 打赏举报 回复 我感觉怎么写得挺便扭的,一个任务就可以完成的东西,为什么要在两个任务里做 barryan2007 2010-08-25 打赏举报 回复 问题解决了吗? baiwan111 2010-08-20 打赏举报 回复 用二维数组是为了方便给任务堆栈分配空间而已,这个不是问题。
[Quote=引用 1 楼 lbing7 的回复:]
首先,不知道你用的是哪个版本的系统
建任务的时候怎么用二维数组的地址,这个得想想
[/Quote] baiwan111 2010-08-20 打赏举报 回复 我用的是V2.00的,已经得到答复,具体我要验证一下。
void main (void)
{
OSInit();
......
OSTaskCreate(Task, (void *)0, (void *)&TaskStk[0][0], 10);
OSTaskCreate(Task1, (void *)0, (void *)&TaskStk[1][0], 12);
......
OSStart();
}
void Task1(void *data)
{
UBYTE x1;
x1=x1;
for (; {
*LED0 =1;
OSTimeDly(3); /*从Task切换到此处,该任务也进入等待态,只有空闲任务运行 ,在3个时钟周期后, Task被重新调度运行,所以LED不是没灭,只是时间很短; */
}
}
void Task (void *data)
{
for (; {
*LED0 =0;
OSTimeDly(3); /*由于此任务优先级高,所以首先运行,当运行到此处,进入等待态,此时Task1运行,并且在Task1中LED0被马上修改为1,所以LED0灭的时间与任务切换时间相等,所以如果修改为OSTimeDly(6),则在Task运行完之后Task1不马上运行,即可*/
}
} tigedtp 2010-08-19 打赏举报 回复 可能是高优先级任务一直在运行,进不了灭灯的那个任务,把其它任务都干掉试试。 lbing7 2010-08-19 打赏举报 回复 然后。OSTimeDly(3);
这个是把任务挂起,三个系统“滴答”。
这个和你系统“心跳”时钟的定时长度配置有关系,自己看一下是不是太短了? lbing7 2010-08-19 打赏举报 回复 首先,不知道你用的是哪个版本的系统
建任务的时候怎么用二维数组的地址,这个得想想 ucosii中的systick和OSTimeDly OSTimeDly(x)函数和SYSTick系统时钟,这两个为整个系统的关键点,同时也是我开始学习uC/OS-ii到现在碰到的最难理解的问题,可能是一直都处于裸机奔跑状态,对OS还是感觉到很陌生,一时间很难去接收这样一个非常伟大的东西。 UCOSIII 思维导图.zip_UCOS 思维导图_UCOSIII 思维导_ucOSiii_ucos_思维导图 本文介绍了UCOS_III的思维导图,有助于学习者理清思路。 UCOS系统使用教程含代码 基于UCOS信号量通信及DMA传输的数据采集处理实验 以及任务任务延时等实验 ucos-two-PWM_ucos控制两路pwm_ 本样例是ucos控制两路pwm UCOS-II的源代码有中文注释 让你轻松理解作者的每一步,对每一个汇编语句的来历、为什么要用这个语句的理解非常有帮助
单片机/工控
27,508
社区成员
28,796
社区内容
发帖 与我相关 我的任务 单片机/工控 硬件/嵌入开发 单片机/工控 复制链接
扫一扫 分享 确定 社区描述 硬件/嵌入开发 单片机/工控 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告 试试用AI创作助手写篇文章吧
+ 用AI写文章