我为什么写这个RTOS
我在初学单片机没多久的时候就已经知道单片机可以用RTOS来实现任务调度了,但当时我认为RTOS只会拖累性能,把任务调度交给别的东西实现感觉怪不踏实的。后面写程序遇到了一些刁钻的情况,主循环有两个任务,一个耗时短(转发音频数据到IIS),但需要及时响应中断的操作,并且不能拖太长时间,但另一个任务是耗时较长的任务(渲染,刷新屏幕)。如果耗时较长的任务运行时中断来了,另一个任务就会因为耗时长的任务没完成而耽搁了(输出的音频断流)。但实际上,如果耗时短的任务能抢占耗时长的任务的话,单片机的性能是完全足够的。
当时我还是利用了一个定时器中断,让那个耗时短的任务在定时器里一直查询运行,利用中断能抢占主循环来解决这个矛盾的。
现在看来,如果使用RTOS的话,这种情况很容易解决,两个线程+若干个二值信号量就能解决了。
我开始尝试使用RTOS,但FreeRTOS通过的接口…,虽然我知道它是为了节省代码量,复用了队列的机制,但这导致了很多API其实是一个宏定义,但这种形式的接口令我很烦躁,我更喜欢Ctrl+左键
就能跳转有注释的函数声明的那种形式。
同时,我在了解了Cortex-M的一些机制后(得益于Cortex-M3权威指南
),发现实际上自己写一个RTOS没有那么难,所以与其忍受别人的代码,还不如自己写一个RTOS。
当然,我写一个RTOS也不是一帆风顺的,我写的这个H_TS
早在21年七八月时基本就完成了,但实际上它还有一些隐藏bug,后面又修修改改修复了,但还是有一些更隐蔽的bug,这些bug我还是在STM32H7
用H_TS
跑适配操作系统的LwIP
时发现的,当时是通过测试单向发送/接收TCP极限速度时发现的,由于速度很高(TCP传输速度达到10MB/s相当于80MBps),相当于每秒至少传7000个包(以一个TCP包1500字节计算),这将触发更高频率的线程调度和信号量操作,当时的情况时传输了一段时间网速就断了,无数据传输了,最后发现是信号量的双向同步有疏忽,没处理好,最后修复了这个问题。
目前,这个RTOS已基本完成(后续不出意外,只会处理一些bug)。
源码
Gitee:https://gitee.com/H0x9DEFA478/H_TS.git.
目前已更新了一个文档,两个例子。
F4和F1的例程包含了通过信号量,FIFO包装的串口流,通过串口助手可以发送“ GetThreadInfo”
或“ GetStackInfo”
来获取信息。(这两个指令的开头是一个空格)。
特性
部件特性
更多部件特性见gitee中的文档。
其他内容
其他内容(例如移植事项等)参见gitee中的文档。