嵌入式编程领域多年工作经验的工程师意见,汇总成

在单片机嵌入式编程中,最难的两部分是interrupt和MM(memorymanage),之所以有人觉得并不困难,那是因为太多数情况下芯片制造商都已经直接写好,但是如果设计者本身就在为芯片制造商工作,那就必须自己会写配置文件。

在单片机嵌入式编程中,最难的两个部分就是中断和MM(内存管理)。 之所以有人觉得不难,是因为大多数情况下芯片厂商都已经直接写好了,但是如果设计者本人在芯片厂商工作的话,那么配置文件肯定是可以自己写的。

这两件事之所以比较困难,是因为它们需要用汇编或者类C来写,这些都是比较底层的东西。 中断包括外部中断和内部中断。 外部中断有两种实现方式,硬件中断方式和软件中断方式。 相对来说,比较简单,属于应用层面。 相比之下,内部中断要复杂得多。 内部中断主要是由重启、总线错误、溢出、验证错误等引起的,很多软件开发者基本上不会写相应的中断服务程序,因为太难了,一般不会用。 但一旦发生,就是致命的错误。 因此,从整个系统的鲁棒性来看,必须要有相应的ISR。 这也是飞思卡尔专家推荐的,所以我们来谈谈嵌入式编程中应该注意的问题。

延迟

嵌入式编程经常涉及硬件操作,例如ADC、打开或关闭电流源,这些操作需要时间,因此当发出这些指令时,立即读取寄存器值将不会得到期望的结果。 ,并且找不到原因。 有时所需的延迟比较长,达到ms级别。 一般来说,us级别就够了。 它取决于每个芯片的时钟频率,而不仅仅是MCU的总线时钟频率。

多变的

一般来说,如果变量的作用域和生命周期都非常明确,就应该定义相对变量,比如const、static等,这样比较不容易出错。 不建议将所有变量定义为全局变量,管理起来比较麻烦。 程序一旦出错,破坏性会很大,函数也是如此。 全局变量和通用函数必须声明,这样调用时就不太可能出错。 而且,有些编译器对于未声明的函数不会报错,但是在调用时会发出类型隐式转换的警告。 这里我就不举例了。 总之,这一点你要特别小心。

宏定义

在编程过程中,应尽量对某些特定的数字使用宏定义。 这样做的好处是更直观,也更容易以后维护。 否则,如果你长时间看到这个数字,你就记不住它的意思了。 宏定义不会给程序带来任何负担,因为它在编译过程中已经被完全替换,因此可以尽可能广泛地使用。 值得一提的是,宏定义并不局限于使用常量。 它可以定义函数。 由于是直接替换,避免了压栈和出栈,提高了程序执行效率,同时也增加了代码量。 因此,一般都是使用比较简单的函数,它也有一个缺点,就是在替换过程中不会检查参数类型是否正常,从而增加了安全风险。 解决这个问题的方法是使用一个名为inline的内联函数,它继承了宏定义的优点,弥补了它的缺点,因此是最好的选择。 不过这属于C++的范畴,有一定的难度。 这里我就不详细说了。 有兴趣的朋友可以参考相关资料。

浮点运算

大多数低端微控制器不支持浮点运算,因此在实际使用中很少使用。 因此,为了降低成本,一般都会去掉浮点运算模块。 这就带来了一个问题。 如果使用浮点运算怎么办? 细心的朋友可能会发现,即使是没有浮点运算的单片机,​​在仿真调试过程中仍然可以使用floatordouble的数据类型进行计算,而且结果也非常准确。 为什么是这样? 之所以实现这一点是因为编译器自动调用库函数,通常是通过迭代的方法,所以它的执行效率非常慢。 不推荐这种方法,通常使用“定点”方法来解决这个问题。 例如,对于一个32位的数据,可以假设它的低8位是小数位,然后进行移位计算,类似于整数运算。 这种方法比较复杂,但是可以非常准确。 另一种方法是直接放大10N倍,用平方倍数计算整数,可以得到近似值。 因此,为了不增加不必要的麻烦,应尽量避免使用浮点运算,一般情况下是可以避免的。

看门狗

以三重看门狗为例。 看门狗1检查时钟频率,看门狗2监视一小段代码。 必须在比较短的时间内喂一次,一般要求在250us到650us之间喂一次,看门狗3监控一大段代码。 ,要求在较长的时间内喂食一次,通常在100ms以内,并且必须同时满足三个条件。 这就需要对代码的执行过程有非常清晰的了解,不然可能会导致喂狗重启出错。

这里需要强调的是,在单片机嵌入式编程过程中,程序的质量往往是由细节决定的。 一个程序写得是否详细、灵活,与日积月累的知识积累和实践训练成正比。 虽然编程是一个很枯燥甚至乏味的过程,但是成功后的喜悦可以让大家相信付出的努力是值得的。

单片机

单片机最小系统专业电子科学与技术班级1102班课程设计

2024-4-26 4:04:42

单片机

种植树莓的土地用机械全面翻耕犁耙一遍

2024-4-26 5:04:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索