0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式思想与PC思想结合

STM32嵌入式开发 来源:CSDN-coolbacon 2023-05-10 10:42 次阅读

能从PC机器编程去看嵌入式问题,那是第一步;

学会用嵌入式编程思想,那是第二步;

用PC的思想和嵌入式的思想结合在一起,应用于实际的项目,那是第三步。

很多朋友都是从PC编程转向嵌入式编程的。

在中国,嵌入式编程的朋友很少是正儿八经从计算机专业毕业的,都是从自动控制啊,电子相关的专业毕业的。

这些童鞋们,实践经验雄厚,但是理论知识缺乏;计算机专业毕业的童鞋很大一部分去弄网游、网页这些独立于操作系统的更高层的应用了。

也不太愿意从事嵌入式行业,毕竟这条路不好走。他们理论知识雄厚,但缺乏电路等相关的知识,在嵌入式里学习需要再学习一些具体的知识,比较难走。

虽然没有做过产业调查,但从我所见和所招聘人员,从事嵌入式行业的工程师,要么缺乏理论知识,要么缺乏实践经验。

很少两者兼备的。究其原因,还是中国的大学教育的问题。这里不探讨这个问题,避免口水战。我想列出我实践中的几个例子。引起大家在嵌入式中做项目时对一些问题的关注。

第一个例子:

同事在uC/OS-II下开发一个串口的驱动程序,驱动和接口在测试中均为发现问题。应用中开发了个通讯程序,串口驱动提供了一个查询驱动缓冲区字符的函数:GetRxBuffCharNum()。

高层需要接受一定数量的字符以后才能对包做解析。一个同事撰写的代码,用伪代码表示如下:

00118dc6-ee49-11ed-90ce-dac502259ad0.png

这段代码判断当前缓冲区中超过30个字符,就将缓冲区中全部字符读到缓冲区中,直到读取成功为止。

逻辑清楚,思路也清楚。但这段代码是不能正常工作。如果是在PC机上,定然是没有任何问题,工作的异常正常。但在嵌入式里真的是不得而知了。同事很郁闷,不知道为什么。

来请我解决问题,当时我看到代码,就问了他,GetRxBuffCharNum()是怎么实现的?打开一看:

0024346c-ee49-11ed-90ce-dac502259ad0.png

很明显,由于在循环中,interruput_disable()和interrupt_enable()之间是个全局临界区域,保证gRxBufCharNum的完整性。

但是,由于在外层的do { } while() 循环中,CPU频繁的关闭中断,打开中断,这个时间非常的短。

实际上CPU可能不能正常的响应UART的中断。当然这和uart的波特率、硬件缓冲区的大小还有CPU的速度都有关系。我们使用的波特率非常高,大约有3Mbps。

uart起始信号和停止信号占一个比特位。一个字节需要消耗10个周期。3Mbps的波特率大约需要3.3us传输一个字节。

3.3us能执行多少个CPU指令呢?

100MHz的ARM,大约能执行150条指令左右。结果关闭中断的时间是多长呢?一般ARM关闭中断都需要4条以上的指令,打开又有4条以上的指令。

接收uart中断的代码实际上是不止20条指令的。所以,这样下来,就有可能出现丢失通信数据的Bug,体现在系统层面上,就是通信不稳定。

修改这段代码其实很简单,最简单的办法是从高层修改。即:

003e07e8-ee49-11ed-90ce-dac502259ad0.png

这样,让CPU有时间去执行中断的代码,从而避免了频繁关闭中断造成的中断代码执行不及时,产生的信息丢失。

嵌入式系统里,大部分的RTOS应用都是不带串口驱动。 自己设计代码时,没有充分考虑代码与内核的结合。 造成代码深层次的问题。

RTOS之所以称为RTOS,就是因为对事件的快速响应; 事件快速的响应依赖于CPU对中断的响应速度。

驱动在Linux这种系统中都是与内核高度整合,一起运行在内核态。 RTOS虽然不能抄袭linux这种结构,但有一定的借鉴意义。

从上面的例子可以看清楚,嵌入式需要开发人员对代码的各个环节需要了解清楚。

第二个例子:

同事驱动一个14094串转并的芯片。 串行信号是采用IO模拟的,因为没有专用的硬件。 同事就随手写了个驱动,结果调试了3、4天,仍旧是有问题。

我实在看不下去了,就去看了看,控制的并行信号有时候正常有时候不正常。 我看了看代码,用伪代码大概是:

005499a4-ee49-11ed-90ce-dac502259ad0.png

将数据的8个bit在每个高电平从bit0到bit7依次发送出去。 应该是正常的啊。 看不出问题在哪啊?

我仔细想了想,有看了14094的datasheet,明白了。

原来,14094要求clock的高电平持续10个ns,低电平也要持续10个ns。 这段代码之做了高电平时间的延时,没有做低电平的延时。 如果中断插在低电平之间工作,那么这段代码是可以的。

但是如果CPU没有中断插在低电平时执行,则是不能正常工作的。 所以就时好时坏。

修改也比较简单:

0069f1b4-ee49-11ed-90ce-dac502259ad0.png

这样就完全正常了。 但是这个还是不能很好移植的一个代码,因为编译器一优化,就有可能造成这两个延时循环的丢失。

丢失了,就不能保证高电平低电平持续10ns的要求,也就不能正常工作了。

所以,真正的可以移植的代码,应该把这个循环做成一个纳秒级的DelayNs(10);

像Linux一样,上电时,先测量一下,nop指令执行需要多长时间执行,多少个nop指令执行10ns。

执行一定的nop指令就可以了。利用编译器防止优化的编译指令或者特殊的关键字,防止延时循环被编译器优化掉。如GCC中的

__volatile__ __asm__("nop; ");

从这个例子中可以清楚的看到,写好一段好代码,是需要很多知识支撑的。你说呢?

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288350
  • 接口
    +关注

    关注

    33

    文章

    7635

    浏览量

    148453
  • PC
    PC
    +关注

    关注

    9

    文章

    1950

    浏览量

    152788
  • 计算机
    +关注

    关注

    19

    文章

    6646

    浏览量

    84487
  • 编程
    +关注

    关注

    88

    文章

    3439

    浏览量

    92375

原文标题:嵌入式思想与PC思想结合

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    深入了解嵌入式编程

    能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC思想
    的头像 发表于 10-18 09:56 3381次阅读

    嵌入式编程项目需要的注意事项

    能从PC机器编程去看嵌入式问题,那是第一步;学会用嵌入式编程思想,那是第二步;用PC思想
    发表于 12-23 10:40 518次阅读

    嵌入式编程思想

    本帖最后由 xh23 于 2016-3-25 10:49 编辑 希望大家一起学习,分享嵌入式编程一点经验
    发表于 03-25 10:47

    嵌入式软件设计之思想与方法

    本帖最后由 lee_st 于 2018-2-24 17:16 编辑 嵌入式软件设计之思想与方法
    发表于 02-24 17:15

    嵌入式软件和PC结合

    随着移动互联网应用渐渐走热,Inel 嵌入式X86芯片重返市场,传统的嵌入式系统平台、软件开发方式和操作系统都在发生着变化。一个方面,互联网需要更多已经在PC使用的应用软件,能够在各种移动终端
    发表于 07-16 06:44

    怎么利用分层思想进行嵌入式项目设计

    利用分层思想进行嵌入式项目设计,你试过吗?
    发表于 05-22 10:16

    嵌入式开发必须掌握的设计思想

    嵌入式开发重要的2个设计思想
    发表于 03-09 07:02

    中间件思想嵌入式GIS设计中有哪些应用?

    中间件是什么?有什么作用?中间件应用现状及未来发展趋势如何?中间件思想嵌入式GIS设计中有哪些应用?
    发表于 04-27 07:05

    嵌入式系统相比较PC机有何优势

    来源:ittbank首先,“嵌入式”这是个概念,准确的定义没有,各个书上都有各自的定义。但是主要思想是一样的,就是相比较PC机这种通用系统来说,嵌入式系统是个专用系统,结构精简,在硬件
    发表于 11-23 08:53

    嵌入式系统硬件抽象层的设计思想简析

    嵌入式系统硬件抽象层(HAL & BSP)的设计思想1 前言1.1 层次化思想1.2 模块化思想1.3 对象化思想2 板级支持包(BSP)3
    发表于 02-11 07:49

    基于AVR单片机的嵌入式“瘦服务器”系统设计思想

    基于AVR单片机的嵌入式“瘦服务器”系统设计思想 根据国内嵌入式设备的研究形势和产业发展规模,提出了基于AVR单片机(ATmega103)的嵌入式 “瘦
    发表于 05-04 22:10 863次阅读
    基于AVR单片机的<b class='flag-5'>嵌入式</b>“瘦服务器”系统设计<b class='flag-5'>思想</b>

    嵌入式开发的2个设计思想

    笔者参考了市面上各种各样的嵌入式书籍,如MCS-51、AVR、ARM等都有看过,但没发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但如何写得好、写得快,那是需要点经验积累的。所以在
    的头像 发表于 02-10 11:42 573次阅读
    做<b class='flag-5'>嵌入式</b>开发的2个设计<b class='flag-5'>思想</b>

    嵌入式开发,这2个设计思想要掌握!

    笔者参考了市面上各种各样的嵌入式书籍,如MCS-51、AVR、ARM等都有看过,但没发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但如何写得好、写得快,那是需要点经验积累的。所以在
    发表于 02-26 06:01 11次下载
    做<b class='flag-5'>嵌入式</b>开发,这2个设计<b class='flag-5'>思想</b>要掌握!

    嵌入式开发,这2个设计思想要掌握!

    笔者参考了市面上各种各样的嵌入式书籍,如MCS-51、AVR、ARM等都有看过,但没发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但如何写得好、写得快,那是需要点经验积累的。...
    发表于 01-14 09:59 5次下载
    做<b class='flag-5'>嵌入式</b>开发,这2个设计<b class='flag-5'>思想</b>要掌握!

    怎么从PC编程转向嵌入式编程

    能从PC机器编程去看嵌入式问题,那是第一步; 学会用嵌入式编程思想,那是第二步; 用PC思想
    的头像 发表于 06-22 10:36 418次阅读