嵌入式编程软件基础汇总2

工作知识学习及总结系列文档
本文主要记录学习嵌入式软硬件编程过程中的一些基础知识


1,看门狗

 专用的监控电路,在系统“跑飞”时进行系统复位 → 提高可靠性
在这里插入图片描述
具体的看门狗电路介绍参考 嵌入式硬件基础知识汇总<附带与硬件密切相关的软件介绍>中第三章内容。

1.1,基于看门狗电路的多任务软件

 嵌入式软件设计中,有任务、中断服务程序可在看门狗溢出前调用“reset_watchdog( )”进行看门狗复位 → 调用周期小于看门狗溢出时间;
 软件跑飞后,系统会被复位。
在这里插入图片描述

1.2,设计看门狗任务

 看门狗电路不是必须的;

 软件中设定一个看门狗任务𝑇𝑊𝐷𝐺(心跳任务),监测一组任务;
① 𝑇𝑊𝐷𝐺为周期性任务,一个全局变量count;
② 每个周期到来时,执行count++操作,并判断count值是否大于一个门限值MaxCount;
✓ 如果不大于,退出;
✓ 如果大于门限值,设置复位寄存器,复位硬件。

 每个被监测任务
正常执行时,在某段代码部分执行count=0;

1.2.1,“与逻辑”看门狗任务

 部署一个看门狗任务𝑇𝑊𝐷𝐺来监测系统中的一组关键任务;
与逻辑:当一个任务出现故障时,认定整个系统故障;
 𝑇𝑊𝐷𝐺可通过定时向被监测任务发送检测信号,或者收集这些任务定期上传的状态来感知每一个被监测任务的运行是否正常;
✓故障时软件复位,或,通过看门狗电路(如有)复位。

在这里插入图片描述

1.2.2,“或逻辑”看门狗任务

 部署一个看门狗任务𝑇𝑊𝐷𝐺来监测系统中的一组关键任务;
或逻辑:当所有任务都出现故障时,认定整个系统故障;
 𝑇𝑊𝐷𝐺可通过定时向被监测任务发送检测信号,或者收集这些任务定期上传的状态来感知每一个被监测任务的运行是否正常;
✓故障时软件复位,或,通过看门狗电路(如有)复位。

在这里插入图片描述

1.2.3,几种基本监测方法

 通用实现方法
①𝑇𝑊𝐷𝐺与第𝑖个被监测任务𝑇𝑖共享一个变量f_WDi;
② 𝑇𝑖执行f_WDi++操作,𝑇𝑊𝐷𝐺执行f_WDi–操作并判断f_WDi是否小于之前的值,如是,𝑇𝑖任务故障。(小于之前的值说明该任务没有正常执行,所以没有进行f_WDi++操作)

 任务间通信机制
✓ 𝑇𝑊𝐷𝐺任务向𝑇𝑖任务发送消息,并等待该任务反馈,根据反馈确定状态。
 利用内核看门狗定时器,以VxWorks为例

在这里插入图片描述
右边程序为创建看门狗,并且在溢出时调用左边的应急处理代码。此为系统机制。

1.2.4,设计建议

 看门狗任务(心跳任务)机制可在一定程度上提高软件的可靠性,但该任务也可能“跑飞”,提升有限;
如有条件,应采用硬件看门狗电路、EOS内核的看门狗定时器机制,以软硬件协同的方式提高可靠性
 𝑇𝑊𝐷𝐺与被监测任务之间若采用共享变量,需慎重考虑数据共享问题;

2, 代码共享问题──可重入函数

2.1,程序变量的存储与访问

text段(只读):存放程序代码,编译时确定;
data段:即静态存储区,存放在编译阶段(而非运行时)就能确定的数据。存放赋了初值全局变量、静态变量以及常量
bss段:存放定义但未赋初值全局变量和静态变量;

在这里插入图片描述

在这里插入图片描述

2.2,代码的可重入性

示例分析
 foo()函数可被多个任务同时调用而不出错?(不出错说明共享性好)

在这里插入图片描述
在这里插入图片描述
上图中 foo()中静态变量 s_i_temp0 在被不同任务调用时产生数据共享冲突,所以 foo()是否是可重入代码存疑。

 可重入代码(reentrant code),也称为纯代码,是影响多任务嵌入式系统可靠性的重要方面!
 本质:变量、资源的共享问题 → 代码不可同时被多个任务调用执行 →代码的可重入问题!

可重入函数是一个能被多个任务调用的函数;
可重入函数可以由多个任务并发调用,而不必担心数据错误;
不可重入(non-reentrant)函数不能由多个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断);
可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据

在这里插入图片描述
判断一个函数是否可重入的基本规则
一个可重入的函数一般用原子的方法使用变量,除非这些变量存储在调用这个函数的堆栈中或这些变量是任务的私有变量;
一个可重入函数一般不调用其他不可重入的函数;
一个可重入函数一般不用非原子的方法使用硬件。

示例分析1
在这里插入图片描述
该段代码是否可重入?
首先,fError在内存中的位置固定,可被多个任务共享;
其使用是非原子的,因为在其被检测或赋值期间可能出现任务切换!
其次,如果 display()可重入,那么其调用的函数就必须可重入,而 printf() 不一定满足!

示例分析2
在这里插入图片描述
其中 “++” 操作是否可重入取决于硬件:
在这里插入图片描述
在8051单片机中,要进行多次MOVE操作,所以不是原子的。

在这里插入图片描述

2.3,可重入函数的基本设计方法

设计软件机制(参照 嵌入式编程软件基础汇总1 中第七章),或EOS内核的互斥信号量机制,建立临界区,原子地访问共享变量、共享资源;
不调用不可重入的函数。

引入任务变量机制,如VxWorks中
 在任务的 TCB 中引入了四个字节的任务变量(TaskVar),指向一个特定内存空间;
 虽任务变量名称相同,但在不同任务中指向不同内存空间,且当任务发生切换时,任务变量的值也将自动切换;
✓ taskVarAdd(0, &globDat); 该调用将为任务添加一个globDat任务变量。

在这里插入图片描述
在任务体中不能多次添加同一个任务变量;多次添加会使得任务执行不可预测。

在这里插入图片描述

2.4,小结

 可重入代码的本质是共享资源问题;
 结合软硬件特性,灵活掌握基本判定原则;

3,定时器和时钟

参考链接:
1, 说说M451例程讲解之定时器 .

4,AT指令解析编程

参考链接:
1, AT命令简易解析 .
2,** 使用C语言sscanf函数解析AT指令.
注释:
(1), C 库函数 - strstr().
(2),C 库函数 - sscanf().
(3),C语言“正则表达式”字符串处理sscanf(),使用前缀技巧、匹配邮箱等.

3, AT指令的发送与接收.
4, AT指令的一种解析想法(有点看不懂).
5, 简单的AT指令解析.
6, STM32中自己定义AT指令,取出字符串中间任意数据的方法.
7, AT指令打包发送(嵌入式+物联网)编程心得C语言.
8, AT指令(嵌入式+物联网)编程心得C语言(二).
9,C语言at指令程序,C语言实现AT指令ASCII码的拼接处理流程.
10,C语言 | 使用 sscanf 提取AT命令返回结果中的有效数据.
11, 串口中怎样接收一个完整数据包的解析.


本文来源链接:
1, 大连理工大学赖晓晨老师的慕课----嵌入式软件设计
2, 嵌入式系统慕课—张凯龙.
本文仅作为个人学习总结使用,如有侵权,请联系删除~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值