【嵌入式编程踩坑记】 - 裸机 -定时器中断中套
定时器是嵌入式裸机编程常用的片上外设,一般是按照一定时间产生一次中断。中断到了代表时间到了。这样,嵌入式工程师就可以用定时器,在特定的时间,做一些事情。这里,以每秒钟打印“hello\r\n"为例,有两种看上去可以完成想要的操作的方式:
第一种 :
#define taskInterval = 1.00;
float taskTimeRemain = taskInteval;
void main()
{while(1){}
}void timerIntFuc1ms(void)
{if( taskTimeRemain > 0 ){taskTimeRemain -= 0.001;if( taskTimeRemain <= 0 ){printf("hello.\r\n"); //很大概率导致死机!!!!}}
}
这种方式有着天然的隐患:
在调用printf时,如果串口波特率不够高,或者发出字符串的长度达到一定长度,那么芯片就会死机。
原因在于:
IO操作占用了大量的时间,当它还没有完成的时候,下一个定时器中断到达了,由此产生死机。
即假设发送一个字符是1ms,完成例子中的printf本身是需要一个7ms的过程的,这个时长足够定时器中断触发7次,显然是不合理的。
那么,如何在特定时间完成IO,又不和定时器中断冲突呢?
用如下方式:
#define taskInterval = 1.00;
float taskTimeRemain = taskInteval;void main()
{while(1){if( taskTimeRemain <= 0 ){printf("hello.\r\n");taskTimeRemain = taskInteval;}}
}void timerIntFuc1ms(void)
{if( taskTimeRemain > 0 ){taskTimeRemain -= 0.001;}
}
由此提醒我们,在程序设计中一定要有“消息传递”的思想,尤其是在中断和程序功能之间。
中断最好作为某事件产生的触发信号。
记住那句老生常谈:中断中不要处理耗时很长的工作”
再记住一个关键点:IO操作一般是相当费时间的!比如串口,常用波特率要达到毫秒级!在定时时间很短的中断里执行,必然死翘翘。
不止定时器中断,其它中断同理!
如果更紧一步骤,发送频率比1ms大但是小于7ms怎么办?
首先:必须保证IO读写的速度,足以满足在规定时间内完成输出。
然后,可以考虑使用DMA.
在裸机编程的世界里,就是要把芯片的能力尽可能榨干 —— 如果时间允许 : DMA 能用必须用!
【嵌入式编程踩坑记】 - 裸机 -定时器中断中套相关推荐
- 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想
前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- Go 语言踩坑记——panic 与 recover
题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享
免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 - 从赛扬G5900"亮机"CPU说起 - 10代Core Wi ...
- 移动端踩坑记---------ios下输入法遮挡input
移动端踩坑记---ios下输入法遮挡input 最近项目中遇到了一个比较严重移动端IOS下的Fixed兼容问题,网上也有很多人躺在这个问题上了,现在开始详细讨论一下这个问题. 现在我们先来看一 ...
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...
- Spring @Transactional踩坑记
@Transactional踩坑记 总述 Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...
- 服务器重新部署踩坑记
服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...
最新文章
- vue-cli 使用小技巧
- mysql死锁场景汇总整理
- 前端学习(2997):vue+element今日头条管理--编码规范说明
- 部署Symantec Antivirus 10.0网络防毒服务器之三
- MonoMac 1.0正式发布
- TranslateAnimation详解
- 用Python搭建http文件下载服务器
- 高山流水 (余秋雨)
- 如何在Node.js应用程序中使用RethinkDB
- 大家都在学C语言吧,作为程序员这有一个问题,秃顶算工伤吗?
- 对称矩阵的判定 C语言 SDUT
- 初识流媒体与流媒体技术
- Java技术交流群[微信](Talking Coding)
- Android进阶——Small源码分析之启动流程详解
- vue 使用人脸识别_使用Vue.js和Kairos构建简单的人脸识别应用
- h5天气预报插件代码 漂亮的天气预报代码 站长必备
- java遍历map并赋值的最优解
- Java之Math三种取整方法
- 电子一寸照片怎么弄?教你修改照片尺寸小妙招
- NRF52832学习笔记(38)——修改发射功率