定时器是嵌入式裸机编程常用的片上外设,一般是按照一定时间产生一次中断。中断到了代表时间到了。这样,嵌入式工程师就可以用定时器,在特定的时间,做一些事情。这里,以每秒钟打印“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 能用必须用!

【嵌入式编程踩坑记】 - 裸机 -定时器中断中套相关推荐

  1. 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想

    前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...

  2. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  3. Go 语言踩坑记——panic 与 recover

    题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...

  4. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  5. 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享

    免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 -  从赛扬G5900"亮机"CPU说起 -  10代Core Wi ...

  6. 移动端踩坑记---------ios下输入法遮挡input

    移动端踩坑记---ios下输入法遮挡input   最近项目中遇到了一个比较严重移动端IOS下的Fixed兼容问题,网上也有很多人躺在这个问题上了,现在开始详细讨论一下这个问题.   现在我们先来看一 ...

  7. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

  8. Spring @Transactional踩坑记

    @Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...

  9. 服务器重新部署踩坑记

    服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...

最新文章

  1. vue-cli 使用小技巧
  2. mysql死锁场景汇总整理
  3. 前端学习(2997):vue+element今日头条管理--编码规范说明
  4. 部署Symantec Antivirus 10.0网络防毒服务器之三
  5. MonoMac 1.0正式发布
  6. TranslateAnimation详解
  7. 用Python搭建http文件下载服务器
  8. 高山流水 (余秋雨)
  9. 如何在Node.js应用程序中使用RethinkDB
  10. 大家都在学C语言吧,作为程序员这有一个问题,秃顶算工伤吗?
  11. 对称矩阵的判定 C语言 SDUT
  12. 初识流媒体与流媒体技术
  13. Java技术交流群[微信](Talking Coding)
  14. Android进阶——Small源码分析之启动流程详解
  15. vue 使用人脸识别_使用Vue.js和Kairos构建简单的人脸识别应用
  16. h5天气预报插件代码 漂亮的天气预报代码 站长必备
  17. java遍历map并赋值的最优解
  18. Java之Math三种取整方法
  19. 电子一寸照片怎么弄?教你修改照片尺寸小妙招
  20. NRF52832学习笔记(38)——修改发射功率

热门文章

  1. 2021疫情之下的计算机培训机构排名来袭!
  2. openSUSE 截图快捷键配置
  3. Android 常用图标库
  4. gitlib初步使用创建项目、角色、合并请求
  5. uniapp之生成海报收款码
  6. pat还差最后4天考试
  7. 安卓开发APP,我要ping通路由器
  8. LTspice FFT 仿真分析
  9. 快速删除选定区域数据
  10. java实现video标签视频流播放