当前位置:网站首页>伪RTOS-ProroThread在CH573芯片上的移植
伪RTOS-ProroThread在CH573芯片上的移植
2022-08-05 05:15:00 【偶可不乖呢】
沁恒的CH573芯片是一个非常便宜好用的蓝牙芯片,采用了RISC内核,主频可达60M,资源是18KB RAM + 448KB FLASH + 32KB DataFlash。
在我们使用了芯片的蓝牙库后,会占用很多的ram,快速代码占用4k多,蓝牙协议栈还需要占用5k左右,还需要预留堆栈左右给芯片使用,留给客户的可用ram空间只剩下了8k不到,所以在给ch573移植操作系统时经常会遇到内存不够用的尴尬处境。
对于这类情况,一般都是使用蓝牙库自带的TMOS进行任务的调度处理。但是TMOS有一个无法避免的缺陷-它不是中断安全的。即我们不可以在中断中调用TMOS的函数,不然会出现函数调用不成功等意外情况,导致功能无法实现。
在这里将介绍一个占用特别小的伪RTOS,即ProtoThread。因为它并不是通过切换芯片寄存器等上下文实现的任务切换,所以只能算一个伪RTOS。
ProtoThread的作者Adam Dunkels,他是UIP,lwIP,Contiki的作者。ProtoThread现在作为物联网操作系统Contiki NG中负责任务调度的部分,它综合考虑了低功耗物联网设备的性能,可以在8位MCU上流畅运行。
在这里我们将介绍如何将ProtoThread移植到CH573,并写DEMO测试。
首先打开https://github.com/smartmx/ProtoThread-Core
https://github.com/smartmx/ProtoThread-Core,从该网址下载从Contiki NG中提取出来的ProtoThread部分,该部分已经做了充分的移植准备工作,无需去Contiki NG源码中一点点移植。
下载后文件目录如下:

将lib、sys、transplant_ports文件夹和protothread.c和protothread.h两个文件拷贝到工程中,自行建立文件夹存放,这里将放在OS/protothread-core文件夹中:

移植ProtoThread-Core只需关注transplant_ports中的pt_ports.c和pt_ports.h两个文件,其他文件无需修改。

这里需要注意,库中已经做好了头文件路径,用户只需要将ProtoThread-Core文件夹目录添加到头文件目录即可,其他文件夹无需一一添加。

先查看pt_ports.h:

移植需要根据上图注释定义好上图中的各个类型,一般32位系统可以默认无需修改。
定义完成后接下来就是要在pt_ports.c中实现头文件中的protothread_clock_init()和protothread_clock_time()两个接口函数。
protothread_clock_init ()是用户调用protothread.c中的protothread_init函数中会调用的子函数,它作用是初始化给protothread的心跳时钟,我们可以在这里编写给心跳时钟初始化,注意需要和pt_ports.h中的PROTOTHREAD_CLOCK_SECONDS宏定义相对应。
比如PROTOTHREAD_CLOCK_SECONDS为1000,那么用户需要实现一个1ms的心跳时钟,这个1ms就是由 1s / PROTOTHREAD_CLOCK_SECONDS 得到的。实现函数的时候注意在pt_ports.h中添加芯片定时器相关的头文件。
这里采用CH573的SysTick作为ProtoThread的时基,并且需要在systick中断中调用protothread的定时器更新函数:

移植必须要在定时器中断中调用以下语句:
进入etimer_request_poll函数中进行查看:

可以看到在此处调用了process_poll,这就是protothread中唤起线程的唯一中断安全的函数,可以在中断中调用。在后续编程时,可以在其他中断中(比如串口中断),唤起相关线程进行数据任务处理。
现在移植函数已经写好,接下来就需要在main函数中进行初始化了,在main函数中添加protothread的初始化:

并且需要在主循环任务中添加protothread轮询任务:

到这里,protothread就移植成功了,这里进行编写一个demo进行功能测试,在app文件夹下新建app_process.c,并在include中新建app_process.h。
编写测试demo:

如果需要在其他文件中调用process,就在头文件中添加PROCESS_NAME:

测试demo使用了contiki的软件定时器etimer,etimer会在一个线程中,在定时器到期后,对该process发送一个PROCESS_EVENT_TIMER的event,该process就会启动并接收到该event。
所以该任务启动时会打印一次“app_process start”,接下来就是每秒钟打印一个protothread etimer。
将程序编译后烧录,观察串口助手:

可以发现运行现象和观察程序得到的结果一致。
本次CH573移植工程已上传到:https://github.com/smartmx/ProtoThread-Templates
https://github.com/smartmx/ProtoThread-Templates
在该网址中,还有STM32F103、STM8S103等芯片的移植例程。
例程中有相关例程运行,可以用来学习参考。
protothread还有很多用法,后续会一一编写相关例程的process进行讲解。
边栏推荐
- dataframe 常用操作
- Flink Distributed Cache 分布式缓存
- MaskDistill-不需要标注数据的语义分割
- 【数据库和SQL学习笔记】3.数据操纵语言(DML)、SELECT查询初阶用法
- 【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作
- CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
- A deep learning code base for Xiaobai, one line of code implements 30+ attention mechanisms.
- flink项目开发-配置jar依赖,连接器,类库
- CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
- 【数据库和SQL学习笔记】8.SQL中的视图(view)
猜你喜欢

The difference between the operators and logical operators

el-table,el-table-column,selection,获取多选选中的数据

Machine Learning (1) - Machine Learning Fundamentals

el-pagination左右箭头替换成文字上一页和下一页

关于基于若依框架的路由跳转

MaskDistill - Semantic segmentation without labeled data
![[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)](/img/7e/566bfa17c5b138d1f909185721c735.png)
[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)

原来何恺明提出的MAE还是一种数据增强

spingboot 容器项目完成CICD部署
![[Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)](/img/ac/884d8aba8b9d363e3b9ae6de33d5a4.png)
[Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
随机推荐
Flink 状态与容错 ( state 和 Fault Tolerance)
如何跟踪网络路由链路&检测网络健康状况
[Over 17] Pytorch rewrites keras
MaskDistill-不需要标注数据的语义分割
Flink和Spark中文乱码问题
Flink accumulator Counter 累加器 和 计数器
如何编写一个优雅的Shell脚本(二)
js实现数组去重
The University of Göttingen proposed CLIPSeg, a model that can perform three segmentation tasks at the same time
Mysql-连接https域名的Mysql数据源踩的坑
Calling Matlab configuration in pycharm: No module named 'matlab.engine'; 'matlab' is not a package
el-table,el-table-column,selection,获取多选选中的数据
Distributed and Clustered
初识机器学习
Flink Oracle CDC写入到HDFS
【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)
Facial Motion Capture 调研
Tensorflow2 与 Pytorch 在张量Tensor基础操作方面的对比整理汇总
【论文精读】Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation(R-CNN)
dataframe 常用操作