380091044 发表于 2024-7-16 10:44:45

hsrzq 发表于 2024-7-16 10:27
你用Keil的学官方更新的那个DEMO就好了呀。
如果用开源工具sdcc的就用我移植的那个呀。 ...

好的,我尝试看看,感谢

380091044 发表于 2024-7-16 15:39:33

tzz1983 发表于 2024-7-15 19:43
你的编思路也很奇怪, 读个键盘代码很复杂吗, 或者说很耗时吗, 为什么要单独搞个任务去读按键?
本来一个任务 ...

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

tzz1983 发表于 2024-7-16 16:04:10

本帖最后由 tzz1983 于 2024-7-16 16:12 编辑

380091044 发表于 2024-7-16 15:39
你说的对,就是哪些挂起和恢复搞的逻辑混乱了,改完后,任务切换了,感谢; ...
你学一学自己分析问题。
用 printf() 在程序运行关键点输出一些信息,以助于分析代码的运行轨迹。

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

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


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

380091044 发表于 2024-7-16 16:56:09

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



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

tzz1983 发表于 2024-7-16 17:00:53

380091044 发表于 2024-7-16 16:56
你说的很对,是要深入研究一个,你说这个借助printf分析代码运行轨迹,我很感兴趣,很想学习,这个通过ke ...

LINK 或 USB-TTL 都可以,

380091044 发表于 2024-7-16 17:29:00

tzz1983 发表于 2024-7-16 17:00
LINK 或 USB-TTL 都可以,

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

hsrzq 发表于 2024-7-16 18:28:20

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



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

tzz1983 发表于 2024-7-16 22:30:34

本帖最后由 tzz1983 于 2024-7-16 22:37 编辑

hsrzq 发表于 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 多行数据输出:




tzz1983 发表于 2024-7-16 22:41:39

380091044 发表于 2024-7-16 17:29
就是通过串口输出到串口助手查看结果是吗?我百度上查是通过串口跟踪, ...
嗯 , 是的, 就是用串口输出, 用串口助手查看.

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

hsrzq 发表于 2024-7-16 22:53:08

tzz1983 发表于 2024-7-16 22:30
不要使用 while(!TI) 这种方式就没问题, 我想就算这样使用也没问题,
你出问题可能是在如果在多个任务中使 ...

是的。
当时我是在把OS往sdcc上移植,OS本身都还没跑通呢,更不会给SBUF加互斥了,所以就被坑了呀……
while(!TI)这个写法,充斥在大量教程中,因为确实比较简单,新手往往最早接触的都是这个写法,被坑的机会相当大,所以我写出来当前车之鉴
页: 1 2 [3] 4
查看完整版本: UCOSII中使用OSTimeDly (INT32U ticks)延时,不进行任务切换?