stm32软件编程的框架及注意事项——rtos篇
0、通常,嵌入式软件(这里指单片机系统)的框架千变万化,有带rtos的,也有裸机的。
0.1、写过带系统的,也写过裸机的,这里总结一下两个类型的框架,记录下自己的心得,主要是文字描述,框架图可以后期添加。
1、freertos框架
1.1、使用标准库,网上有很多一直教程,也有现成移植好的,如果自己使用,可以在config文件下,自己需要根据项目的大小进行系统的裁剪,这方面的教程有很多,官方的,原子的,野火的等等。
1.2、使用hal库,可以直接使用freertos的中间件,在代码中,cubemx其实已经把freertos的接口函数封装了一遍,以至于和原来的freertos的接口函数不一样的,但是实现的功能是一样的,这个宗旨是不能变的。项目中通常采用1000hz的调度频率。
但是使用的方法有些不一样,比如延时函数等,这个可以参考stm32方面的教程,文档名称是《STM32 嵌入式操作系统介绍》(或《STM32RTOS培训_嵌入式操作系统介绍》)这个文档介绍了基本的使用方法。尤其是接口函数的使用。英文也有:
https://arm-software.github.io/CMSIS-FreeRTOS/General/html/index.html
1.3、在cubemx中,可以进行系统的裁剪,可以分配多少空间给任务,默认是128字(128×4个字节),最后可以看看还剩多少空间,根据项目的任务数量来具体分配,还有信号量队列,互斥量,软件定时器一般不怎么用,用的最多的是信号量(用于任务或中断的同步),互斥量(临界区的数据保护)。
1.4、开发中,首先要将信号量,任务先建立,没有中断的芯片驱动可以首先初始化。
如果外部芯片有中断的,可以最后初始化,因为如果初始化后,芯片就会产生一个外部中断,从而调用信号量,但是此时你却没有初始化信号量,从而导致死机,这个一定要注意!
1.5、可以使用一个开始任务,把外设初始化、任务创建放在里面,结束后,删除自己即可。
1.6、中断基本上使用信号量来同步,这个比标志位更方便,在任务中判断信号量是否有新,无效则一直等待,也可以设置一个等待时间,一般都是一直等待,这样任务可以挂起,不影响其他任务的运行,这个裸机是有区别的,而且不用清零标志位。
1.7、任务的周期不能太短,100ms基本上ok,50ms也行的,但是这个任务不能长期执行,否则将导致其他任务饥饿,得不到系统运行的时间。
1.8、任务里面尽量不要使用for循环,可以使用计数器的方式代替,比如一个周期只采样一个通道,这个是比较好的方法,否则for循环会导致占用很多cpu资源,导致其他任务无法运行,或者一个任务,只执行了一半的程序。
1.9、任务基本上采用时间片的方式,其实就是将每个任务的优先级设置为一样,这样系统就会在1ms的时刻运行一次某个任务,下1ms运行下一个任务(就是任务切换),直到所有任务都各自运行了1ms,从头开始运第一个任务。这样基本上不用作临界资源的保护动作。
假如,任务1的延时时间是100ms,程序需要运行30ms,任务2的延时时间是50ms,程序需要运行40ms。那么cpu先在前60ms,间隔运行任务1、任务2,每次运行1ms,60ms后,任务1已经运行完毕,进入挂起态。任务2继续运行,运行到70ms后,任务2也运行完毕,进入挂起态,之后到80ms后重新运行任务2。
可以看看下面的示意图。只说明了大概意思,时间点可能不准确,大家也可以提提意见。
2、软件框架:
通信方式使用tcp协议或者modbus协议。
tcp的物理介质是网线,要注意,交叉线和直连线。
modbus使用rs485的总线,使用rtu方式。
2.1总的框架是:应用逻辑使用java实现,在pc或高级的cpu处理器(可以跑linux这种),单片机实现底层的驱动。
2.2、上位机下发一条指令——>单片机串口接收到数据——>检查数据合法性——>置位相关的标志位——>进行一次设备的操作——>清零相关的标志位——>结束
2.3、串口接收结合定时器的方法,modbus就是使用的这种,3.5T以上如没有数据了,说明一帧数据已经结束。可以进行数据解析了。
2.4、使用标志位的目的是,命令来一次,我单片机只操作一次设备,众所周知,rtos中单片机有好几个死循环的,一直在运行的,因此标志位清零后,就达到了目的,以免频繁的操作设备。有的需要自动控制的,那么,就要合理添加标志位,因此标志位的使用比较关键的,要好好规划。
3、另外一种用的较多的是状态机的方法。
通常我们在使用按键的时候会使用状态机的思想,状态机的思想,我最先是在FPGA的课程中用到,后面就陆续在网上看到这单片机中也经常使用的。因此我在任务中,经常使用到,尤其是与外部设备进行通信的过程中。
3.1、一般串口通信我会分如下几个步骤:
空闲态——这个状态没有任何发送和接收
接收态——数据正在接收,同时定时器在该状态中,判断是否已经有4ms的超时,超时了,立即转为“完成态”,并触发一个接收中断,告知单片机可以处理数据解析,这个时刻可以锁定串口不再接收新的数据,等完成处理,发送回上位机后(如果有必要这个步骤),再开启接收的功能,这样可以创造单片机有一个“数据解析处理”的单独的时间,当然前提是:上位机只有接收到单片机的数据后,才能发送下一条数据。
3.2、当然还可以添加一些其他的状态:
超时
数据帧错误
超载状态
基本上6个状态已经可以够用了,比较健壮的。
3.3、同时还可以添加一个状态机,用于描述一个通信状态是否完成。我这里添加了一个事件的状态机:
初始态——数据没有发送、没有接受
完成态——对应于串口的超时、数据帧错误、超载状态、完成态,这样可以告知单片机,一个时间已经完成,可以进行后续的工作。这个在我单片机要发送两次串口任务中使用到,因为要发送两次停机命令,有两个欧姆龙温控器(modbus控制)。
小结:rtos的框架,基本上使用任务+信号量+状态机,就可以解决中小型的项目,而且有一个优点,任务之间耦合性较低,时间控制方面也是比较好的,基本上有的地方可以不用定时器了,编写代码更加省心,比如点led灯,在裸机里面,必须要使用定时器。
效率方便,代写完裸机后,在进行总结一下。
stm32软件编程的框架及注意事项——rtos篇的更多相关文章
- 中兴软件编程规范C/C++
Q/ZX 深圳市中兴通讯股份有限公司企业标准 (设计技术标准) Q/ZX 04.302.1–2003 软件编程规范C/C++ 20 ...
- STM32 C++编程 004 Adc (数模转换)类
使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...
- php用什么软件编程
准备好好学习学习PHP了吗?那么你首先应该考虑用什么开发工具(IDE).市面上有很多这类工具,收费的有,免费的也有,选择起来并不轻松. 如果你说PHP编程用基础的文本编辑软件就可以了,比如用记事本.是 ...
- 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行
搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...
- STM32软件复位(基于库文件V3.5)
源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- gin框架使用注意事项
gin框架使用注意事项 本文就说下这段时间我在使用gin框架过程中遇到的问题和要注意的事情. 错误处理请求返回要使用c.Abort,不要只是return 当在controller中进行错误处理的时候, ...
- (转)java并发编程--Executor框架
本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
随机推荐
- CentOS 7 安装 mysql 5.7.27 for zabbix
本文是因为需要安装zabbix系统,才贴出的此步骤,供自己查阅方便之用: 在安装使用zabbix前,需要先安装数据库,这里使用的是MySQL数据库进行部署,给出安装步骤,大家觉得有用也可收藏: 当然安 ...
- 【Java并发编程】24、Synchronized实现原理解析
一.概述 我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它. 不过,随着后续Java版本更新对 ...
- Samba + DLAN 实现电视机播放电脑文件
用SMB功能——简单二步让电视访问电脑文件http://tieba.baidu.com/p/5330683066 DLNA怎么用?简单三步实现电脑电视DLNA互联!https://news.znds. ...
- Ubuntu下 安卓 adb 命令报:“insufficient permissions for device: user in plugdev group; ”问题的解决办法
https://blog.csdn.net/freezingxu/article/details/80893025 在接入设备进行联机调试的时候,遇到了这样的问题: insufficient perm ...
- CDA数据分析【第二章:数据收集与导入】
一.概述 数据是对我们所研究现象的属性和特征的具体描述,在分析数据前必须要做的工作就是收集数据.按照存储形式可以将数据划分为结构化数据.非结构化数据和半结构化数据. 1.结构化数据 能够用数据或统一的 ...
- Python学习日记(三十八) Mysql数据库篇 六
Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...
- jq 实现切换菜单选中状态
点击导航菜单,切换选中状态 效果: 思路:首先获取选中的URL,再通过正则判断是否相同,相同就加上相应的属性,不相同就去除相应的属性. html代码 <div class="layui ...
- 认识Redis
认识的Redis 官方原文: Redis is an open source (BSD licensed), in-memory data structure store, used as a dat ...
- 复盘一篇讲sklearn库的文章(下)
skleran-处理流程 获取数据 以用sklearn的内置数据集, 先导入datasets模块. 最经典的iris数据集作为例子. from sklearn import datasets iris ...
- H3C STA>PC的数据转发