初学者常见问题:
4)应用程序接口(API)
接口是对软/硬件对象的抽象,对外提供的服务和访问功能,
即:对象封装后对外呈现成什么样?
原则:(1)使用方便(2)功能丰富(3)但不要过多过滥
【例】为液晶显示模块规划应用程序接口:
5)软件层次
例:菜单程序
(1)杜绝跨层调用
(2)功能模块可以任意拼接、组合
(3)要有硬件隔离层(HAL)
(4)更换任意层代码,上下层建筑不变
(三)版本管理、可配置
(1)尽可能减少软件副本
(2)类似的产品/设计尽可能公用同一代码
(3)利用宏定义配置功能
(4)永远在最新的代码上开发,保留最新版
三 前后台多任务程序设计
(一)前后台程序的基本概念
任务(Task) :指完成某一单一功能的程序
后台程序:对时间要求不严格的任务,通常在主循环内执行
前台程序:要求快速响应或者时间严格的任务,通常中断内
队列/缓冲:用于暂存后台来不及处理的前台事件
(二)前后台程序的编写基本原则
(1)任何一个任务都不能阻塞CPU。
每个任务都应主动结束,让出CPU。不能有等待、死循环、长延时等环节(对初学者来说是难点!)
(2)关注函数重入问题
可重入(Reentrancy):函数在自己调用自己的时候,不必担心数据被破坏。
从软件工程角度对函数可重入的作用可以解释为:具有可重入性的函数能够被多个任务同时调用。在后台程序中,任务都是顺序执行的,不存在多个任务同时调用一个函数的情况。但可能出现前台中断服务程序与后台任务同时调用某个函数。
因此对于前后台公用函数,必须是可重入的。
【例】:
(3)临界代码保护(Critical Code Protection)
临界代码:运行时不可分割的代码,这部分代码不允许被中断打断。
1) 依靠软件产生时间严格时序的程序段。
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\*名称: Pulse 10us()
\*功能: 产生10us脉冲
\*入门参数: 无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Pulse\_10us()
{
\_DINT(); // -------以下是临界代码区,不允许被中断
IO=1; // 置高
\_delay\_cycles(8); // 高电平持续10us (O赋值身耗2us)
IO=0; //置低
_EINTO0; // -------以上是临界代码区-----------
}
2)共享资源互斥性造成的临界代码
程序中任何可被占用的实体都称为“资源”。资源可以是硬件设备,如定时器、串口、打印机、键盘、LCD显示器等,也可以是变量、数组、队列、等数据。
被一个以上任务所占用的资源叫做“共享资源”。共享资源若不能同时被多任务占用,则具有“互斥性”(Mutual Exclusive)。
【例】:前后台同时调用液晶显示函数造成花屏
(4)临界代码的保护方法
-
<