关于ucos中OSTimeDly()的问题

2025-06-10 01:24:48

c罗世界杯冠军

社区 单片机/工控 帖子详情 关于ucos中OSTimeDly()的问题 baiwan111 2010-08-19 03:26:04 我在主程序中的main函数建立的两个任务,程序是正常的,也跑起...

社区

单片机/工控 帖子详情 关于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写文章