找回密码
 立即注册
楼主: 380091044

UCOSII中使用OSTimeDly (INT32U ticks)延时,不进行任务切换?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-16 10:44:45 | 显示全部楼层
hsr*** 发表于 2024-7-16 10:27
你用Keil的学官方更新的那个DEMO就好了呀。
如果用开源工具sdcc的就用我移植的那个呀。 ...

好的,我尝试看看,感谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-16 15:39:33 | 显示全部楼层
tzz1*** 发表于 2024-7-15 19:43
你的编思路也很奇怪, 读个键盘代码很复杂吗, 或者说很耗时吗, 为什么要单独搞个任务去读按键?
本来一个任务 ...

你说的对,就是哪些挂起和恢复搞的逻辑混乱了,改完后,任务切换了,感谢;

点评

你学一学自己分析问题。 用 printf() 在程序运行关键点输出一些信息,以助于分析代码的运行轨迹。 简单点比如: printf("运行到这了01, 某某变量的值是: %x\r\n", 变量名); 像你遇到的这类问题, 还是比较  详情 回复 发表于 2024-7-16 16:04
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-16 16:04:10 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-16 16:12 编辑
38009*** 发表于 2024-7-16 15:39
你说的对,就是哪些挂起和恢复搞的逻辑混乱了,改完后,任务切换了,感谢; ...

你学一学自己分析问题。
用 printf() 在程序运行关键点输出一些信息,以助于分析代码的运行轨迹。

简单点比如:
    printf("运行到这了,第xxx行, 某某变量的值是: %x\r\n",  变量名);

像你遇到的这类问题, 还是比较好找出原因的。


还有就是暂时先学一个OS, 不要又学freeRTOS, 又学 uC/OS,
对于初学者来说, 少一点内容会轻松很多。
还有就是你只要学会一样, 另一个也就学会了, 基本面都是相通的。一通百通。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-16 16:56:09 | 显示全部楼层
tzz1*** 发表于 2024-7-16 16:04
你学一学自己分析问题。
用 printf() 在程序运行关键点输出一些信息,以助于分析代码的运行轨迹。

你说的很对,是要深入研究一个,你说这个借助printf分析代码运行轨迹,我很感兴趣,很想学习,这个通过keil可以实现吗?还是要借助别的工具?

点评

LINK 或 USB-TTL 都可以,  详情 回复 发表于 2024-7-16 17:00
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-16 17:00:53 | 显示全部楼层
38009*** 发表于 2024-7-16 16:56
你说的很对,是要深入研究一个,你说这个借助printf分析代码运行轨迹,我很感兴趣,很想学习,这个通过ke ...

LINK 或 USB-TTL 都可以,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-16 17:29:00 | 显示全部楼层
tzz1*** 发表于 2024-7-16 17:00
LINK 或 USB-TTL 都可以,

就是通过串口输出到串口助手查看结果是吗?我百度上查是通过串口跟踪,

点评

嗯 , 是的, 就是用串口输出, 用串口助手查看. 一般来说, 硬件设计时 UART1的 P30 ,P31本来就用来ISP下载代码, 或USB. 调试时用它输出数据查看, 不会额外占用端口, 用习惯了以后, 比访真好用, 毕竟是真运行, 没  详情 回复 发表于 2024-7-16 22:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-7-16 18:28:20 | 显示全部楼层
tzz1*** 发表于 2024-7-16 16:04
你学一学自己分析问题。
用 printf() 在程序运行关键点输出一些信息,以助于分析代码的运行轨迹。

用printf的话有个小坑要注意一下。
我当时给OS任务切换用的是T0的NMI中断,printf用太多之后打印消息已经超过了一个系统时钟,而我又在putchar中用的是while(!TI)在死等……然后就是T0一直在驱动任务切换,而printf又卡住了任务切换。最终结果是任务切换不了,printf的输出也完全乱了。

点评

不使用 while(!TI) 这种方式就没问题, 我想就算这样使用也没问题, 你出问题可能是在如果在多个任务中使用了UARTx, 则可能SBUF没发送完就被覆盖。 避免的方法很简单, 就是加个互斥访问就可以了. 一般编段小代码,  详情 回复 发表于 2024-7-16 22:30
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-16 22:30:34 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-16 22:37 编辑
hsr*** 发表于 2024-7-16 18:28
用printf的话有个小坑要注意一下。
我当时给OS任务切换用的是T0的NMI中断,printf用太多之后打印消息已经 ...

不要使用 while(!TI) 这种方式就没问题, 我想就算这样使用也没问题,
你出问题可能是在如果在多个任务中使用了UARTx, 导致一字节SBUF没发送完就被另一个任务重写SBUF覆盖。
避免的方法很简单, 就是加个互斥访问就可以了.


编一段小代码, 用中断模式或DMA模式, 加个缓冲区,
写缓冲后让硬件自动处理就可以避免while(!TI)死等了,
你可以参照我的两个移植版的printf代码, 随变怎么发都不会乱. (如果多任务访问,互斥是必须的)
例程硬件只使用了几个GPIO,和串口, 一般的板都是装进去就能直接用

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4702&extra=page%3D1  (uC/OS_STC32G)

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=8195&extra=page%3D1  (uC/OS_STC8H)


printf 多行数据输出:
截图202407162230053719.jpg



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-16 22:41:39 | 显示全部楼层
38009*** 发表于 2024-7-16 17:29
就是通过串口输出到串口助手查看结果是吗?我百度上查是通过串口跟踪, ...

嗯 , 是的, 就是用串口输出, 用串口助手查看.  

一般来说, 硬件设计时 UART1的 P30 ,P31本来就用来ISP下载代码, 或USB.
调试时用它输出数据查看, 不会额外占用端口,
用习惯了以后, 比访真好用, 毕竟是真运行, 没有了那个"访"字. 比"访真" 真得多了
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:456
  • 最近打卡:2025-05-02 08:26:53
已绑定手机

27

主题

341

回帖

1691

积分

金牌会员

机长

积分
1691
发表于 2024-7-16 22:53:08 | 显示全部楼层
tzz1*** 发表于 2024-7-16 22:30
不要使用 while(!TI) 这种方式就没问题, 我想就算这样使用也没问题,
你出问题可能是在如果在多个任务中使 ...

是的。
当时我是在把OS往sdcc上移植,OS本身都还没跑通呢,更不会给SBUF加互斥了,所以就被坑了呀……
while(!TI)这个写法,充斥在大量教程中,因为确实比较简单,新手往往最早接触的都是这个写法,被坑的机会相当大,所以我写出来当前车之鉴
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:03 , Processed in 0.153899 second(s), 123 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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