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)这个写法,充斥在大量教程中,因为确实比较简单,新手往往最早接触的都是这个写法,被坑的机会相当大,所以我写出来当前车之鉴