当前位置:网站首页>一些嵌入式软件设计经验
一些嵌入式软件设计经验
2022-08-03 17:08:00 【李肖遥】
关注、星标公众号,直达精彩内容
来源:CSDN
作者 | twx11213030422
1、什么是框架?
程序框架其实就类似一个文件大纲或者模板。因为写程序就和类似于写文章,如果没有大纲或者模板那么你写起来就会比较费劲。
2、为什么要有框架?
节约时间,减少错误。因为对于一种类型的程序它们代码结构体逻辑是一样的,同时有大量相似或者共同的地方。我们可以将这些共同的地方抽出来形成一个固定的程序框架,那么我们再开发新的同一种类型的程序时就可以套用这套框架。
这样会大大提高我们的开发效率,同时由于这个框架是一套公众的大家都在使用的与维护的,使用它会使代码逻辑更不容易出错。
3、嵌入式系统组成
嵌入式控制系统基本都是由普通任务和中断任务组成。
普通任务:指对时间响应要求不高或者说是那种周期性执行的任务;
中断任务:指对时间响应要求高,必须立刻处理的任务;
4、常见的框架
4.1、轮询无中断
说明:所有的任务都是按照顺序执行,为了减少整个系统的响应时间有两种方法:
任务中不要使用等待式的延时函数;
任务无法一次执行完的情况下应该将任务分解成若干个小任务每次执行一个小任务循环直到任务完成;
上述两种方法都会消耗内存,本来局部变量可以解决的事,现在只能用静态或者全局变量来处理。
优点:程序执行流程简单清晰;
缺点:对于系统修改功能非常不方便,同时如果任务数量增加的话会影响整个系统的响应时间,就会显得系统卡顿;
伪代码实现:
int main(void)
{
while(1)
{
doSomething_1(); //任务1
doSomething_2(); //任务2
doSomething_3(); //任务3
/*其他各种任务*/
}
return 0;
}
4.2、只有中断
说明:在“只有中断“的系统中,主函数main的循环中是不做任何操作的。
优点:可以实时响应异常的任务(事件)
缺点:中断资源有限,当任务过多时会响应不及时。
伪代码实现:
int main(void)
{
while(1)
{
;
}
}
/*中断服务函数1*/
void ISR1_IRQHandler(void)
{
doSomething_1();
}
/*中断服务函数2*/
void ISR2_IRQHandler(void)
{
doSomething_2();
}
4.3、只有中断框架的变种
说明:采用状态机的机制来执行任务。中断函数中设置状态机的状态,而main函数主循环中根据不同的状态值执行不同的任务。这个其实不属于真正只有中断的形式。
int main(void)
{
while(1)
{
if(flag_1)
{
doSomething_1();
}
if(flag_2)
{
doSomething_2();
}
if(flag_3)
{
doSomething_3();
}
/*其他各种任务*/
}
return 0;
}
/*********中断服务函数1************/
void ISR1_IRQHandler(void)
{
flag_1 = ~flag_1;
}
/*********中断服务函数2************/
void ISR2_IRQHandler(void)
{
flag_2 = ~flag_2;
}
/*********中断服务函数3************/
void ISR3_IRQHandler(void)
{
flag_3 = ~flag_3;
}
4.4、轮询有中断
说明:将一些周期性的任务放置在main函数中的主循环中执行:
优点:合理的利用资源,将常规任务与紧急任务分开来了。
缺点:程序结构与逻辑比较复杂,在任务分配以及协作之间需要花费很大精力。
伪代码实现:
int main(void)
{
while(1)
{
if(flag_1)
{
doSomething_1();
}
if(flag_2)
{
doSomething_2();
}
if(flag_3)
{
doSomething_3();
}
/*其他各种任务*/
}
return 0;
}
/*********定时器中断服务函数************/
void ISR1_IRQHandler(void)
{
}
4.5、轮询有中断——虚拟定时器
说明:利用不同的”虚拟定时器“的定时时间来调用不同任务,当定时器的定时时间到时则执行回调函数或者调用任务函数。
这对于一些周期性运行的任务是非常适合的,同时中断可以应对外界的突发事件。这样实时性也可以得到保障,但要注意不要使用等待式延时。一般虚拟定时器的时基为1ms。
优点:任务的时间间隔可以相对精确的控制,同时由于中断使用整个系统的实时性也很不错。
缺点:任务的执行时间无法掌控,当定时任务执行时间过长时会影响到虚拟定时器的定时精度。
虚拟定时器实现代码:
https://codeload.github.com/0x1abin/MultiTimer/zip/master
4.6、非抢占式实时操作系统
说明:任务之间没有优先级之分,每个任务都是依次执行。但是任务的执行时间是由操作系统严格控制的。即使任务没有执行完,当时间片时间达到时任务便会被挂起。
优点:不用再处心积虑的减少任务中的延时,我们只需要将精力放置在业务逻辑上。
缺点:任务之间是平级的,这就会导致有些任务无法得到紧急处理。
伪代码实现:
https://blog.csdn.net/twx11213030422/article/details/104637273
4.7、抢占式实时操作系统
说明:每个任务之间是一个“死循环”同时任务都有一个优先级。高优先级的任务可以打断低优先级的任务,这个就类似于中断一样。所以整个系统的实时性就非常好,同时每个任务都还受时间片的控制也就是说它们的执行时间是可以预测的。它也支持中断可以响应紧急的事件。
优点:实时响应,工程师只需要将精力放置在业务逻辑的实现上
缺点:需要移植且对单片机硬件资源有一定要求;使用比较复杂。
常用的抢占式实时操作系统:Keil RTX、FreeRTOS、uCosII/III等等。
4.8、回调函数
什么是回调函数?
答:函数指针作为函数的形参,然后函数的调用通过此函数指针来实现。
回调函数中注册与回调是什么?
答:注册其实就是使用一个全局的函数指针,然后给此函数指针赋值(将我们自定义的函数名称赋值给它)。然后在中断或者其他地方通过此全局的函数指针来调用我们原先自定义的函数且这个自定义的函数我们也叫回调函数。
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
边栏推荐
- C专家编程 第2章 这不是Bug,而是语言特性 2.2 多做之过
- 【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
- “68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?
- C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
- [Unity Getting Started Plan] Basic Concepts (7) - Input Manager & Input Class
- Detailed explanation of setting HiSilicon MMZ memory and OS memory
- 【目标检测】Focal Loss for Dense Object Detection
- 如何在 DataWorks 中 写SQL语句监控数据的变化到达一定的值 进行提示
- 产品-Axure9英文版,轮播图效果
- EasyExcel implements dynamic column parsing and table storage
猜你喜欢
LeetCode·72.编辑距离·动态规划
[redis] cache penetration and cache avalanche and cache breakdown solutions
中小微企业如何简单便捷、低成本实现数字化?360视觉云有妙招
Huawei, Lenovo, BAIC, etc. were selected as the first batch of training bases for "Enterprise Digital Transformation and Security Capability Improvement" by the Ministry of Industry and Information Te
uniapp 去掉默认导航栏
基于DMS的数仓智能运维服务,知多少?
EasyExcel implements dynamic column parsing and table storage
面试突击71:GET 和 POST 有什么区别?
虹科分享 | 如何测试与验证复杂的FPGA设计(3)——硬件测试
面试突击:什么是粘包和半包?怎么解决?
随机推荐
工程仪器设备在线监测管理系统常见问题和注意事项
B站回应HR称核心用户是Loser;微博回应宕机原因;Go 1.19 正式发布|极客头条
JS 字符串转 GBK 编码超精简实现
数据中台“集存通用治”功能场景说明
【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
isNotBlank与isNotEmpty
sibling component communication context
401. Binary Watch
【云驻共创】【HCSD大咖直播】亲授大厂面试秘诀
FinClip | July 2022 Product Highlights
C专家编程 第3章 分析C语言的声明 3.1 只有编译器才会喜欢的语法
虹科分享 | 如何测试与验证复杂的FPGA设计(3)——硬件测试
SwinIR实战:如何使用SwinIR和预训练模型实现图片的超分
“68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?
C专家编程 第2章 这不是Bug,而是语言特性 2.2 多做之过
酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
Big guys.Use flink-cdc-sqlserver version 2.2.0 to read sqlserver2008R
被误解的 MVC 和被神化的 MVVM(二)
C专家编程 第1章 C:穿越时空的迷雾 1.6 它很棒,但它符合标准吗
Description of the functional scenario of "collective storage and general governance" in the data center