关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
单片机应用程序架构的介绍
[复制链接]
作者:
觋牧
版块:
›
MCU单片机技术
›
单片机入门及综合应用
发布时间:
2018-6-25 13:48:36
857
0
返回列表
觋牧
当前离线
新手上路
新手上路, 积分 36, 距离下一级还需 14 积分
新手上路
新手上路, 积分 36, 距离下一级还需 14 积分
积分
36
发消息
楼主
电梯直达
觋牧
发表于 2018-6-25 13:48:36
|
只看该作者
|
倒序浏览
|
阅读模式
“单片机应用程序的架构”这可能不是一个专业术语,但是是对一些经验的一个总结。我们在开发单片机的时候,程序的架构大致可分为以下三种:
1. 顺序执行程序,这类写法是大多数人使用的方法。
2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。
3. 操作系统,此法应该是应用程序编写的最高境界。
下面来详细的介绍一下:
1.顺序执行
这种方法的应用程序比较简单,在实时性,并行性要求不太高的情况下是一个不错的方法,程序设计简单,思路比较清晰。初学者使用的比较多,但是也是单片机应用最广的一种。我们来看Arduino 库的mian()函数。
这是一个典型的顺序执行的程序模型:
2.时间片轮询法。
很多人说过这种方法,但是都没有讲的很清楚。我也找了好久的资料,看到了这样的例子,感觉还是很不错的,很经典的。我们来看看:
目标:使用1个定时器,完成3个不同的任务。
定义数据
定时器中断服务函数
定时中断服务函数,在中断中逐个判断,如果定时值为0,表示没有使用此定时器或此定时器已经完成定时,不用处理。否则定时器减1,直到为0时,相应标志位值1,表示此任务的定时值到了。
在需要的应用定时的地方添加如下代码
在任务中判断TaskMark[0] 是否为0x01即可
通过上面的例子:定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。这个就厉害了。
循环判断标志位:如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。
执行其他函数:那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?
时间片轮询法的架构:
设计一个结构体
此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数
任务处理
此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。
下面我们就来举例说明这个架构怎么运用吧,我们还是以Arduino为例子,来执行3个任务:每隔1s执行任务1,每隔30ms执行任务2,每隔10s执行任务3。大家不要吐槽,说这个需求就用arduino直接编程就好了,分分钟的事,为啥还要搞的那么麻烦,我只能说,还是要细细研究一下。
我们看一下输出:
有没有有点带上操作系统的感觉。
3.操作系统
操作系统就不说了,多任务那是很简单的事了。就不做介绍了。
总结:时间片轮询法优势还是比较大的,即有顺序执行法的优点,也有操作系统的优点。结构清晰,简单,非常容易理解。用的也是最多的。
更多的内容请关注头条号:小5嵌入式
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
红帽linux[基础命令]特殊变量列表
•
产业缺货背景下,STM32峰会都说了什么?
•
Xmanager使用教程:如何在Linux系统上安装Xterm应用
•
如何在内核中操作某个文件?
•
开源项目EasyDarwin编译:Linux系统下编译运行最新EasyDarwin的步骤介绍
•
利用BATS测试Bash脚本和库|Linux中国
•
硬核观察|Python之父对Rust、Go、Julia和TypeScript的看法
•
干货|手把手带你搞定4大容器网络问题
•
对话胡伟武:和国产CPU一起突围的20年
•
《Linux内核编码风格》官方手册最新中译本
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
招聘&找工作
IT业界资讯
生活交流*灌水区*工程师滋润生活*
linux
快速回复
返回顶部
返回列表