原创 关于编写可靠代码的一些记录

2013-11-28 23:25 1577 17 22 分类: 消费电子
做到代码的静态检查,
代码版本的控制。
慢慢使用MISRA2004+相应的文档规范,
保证新代码的质量与版本控制。
 
如何做到文档与代码同步呢?
必须先整理出文档,
然后再修改?
这或许是,唯一能够保证文档代码同步的方式。
如果写完代码后再来整理文档,
不说能否记得已经修改的要点,
如果还有其他事情要做,
可能就会把文档的事情,给放在不知道哪里了。
 
对于在单片机上编程,
要注意局部变量的大小,
但是,如果把大的局部变量都用全局变量或者局部静态变量来替换,
又会面临一个问题,
如果初始化了,会在加载时拷贝到data段,分配好内存空间,即一直占用内存空间,
如果没有初始化,会加载到bss段,没有分配内存空间,即使用时分配内存空间,
如果这里,变量是没有初始化的静态变量(全局变量),在运行中分配时更会造成想不到的问题。
(注:这里考虑多了,查看了Keil编译后的map文件发现bss段(没有初始化的全局变量)的变量也是已经分配内存空间了)
 
所以在嵌入式编程中,
尽量避免没有初始化的全局变量(局部静态变量)。
 
不能陷入局部的错误查找中,
要能从程序整体上分析,出现错误的原因。
PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

1989tie_959541171 2013-12-5 12:51

知之者易,不知者难,行之者稀。

allen_zhan_752827529 2013-12-5 12:02

事实上, 我有一种隐约的感觉, 无法用明确的表述描绘得清晰. 那就是全局变量和局部变量, 从某种程度上讲, 本质是一致的, 其根本原因就是因为它们都来自 ramdata, 并在某个 routine 中变量有其"生命周期". 局部变量在其"生命周期"内, compiler 给予的 space 的具体内容, 可能被其他的调用可见. 但是一旦超过了这个"生命周期", 那么, 这段空间就被 compiler 释放. 由于我们目前的代码语言, 实际上是函数为核心(另一个流派是 OO 为核心), 这导致我们离开了局部变量的定义的函数, compiler 就释放了局部变量的 RAMDATA 给其他 routine 使用. 也就是说, 架设函数作用时间足够长, 以至于在整个代码生命期(reboot开始算起), 没机会被 compiler 释放, 那么它就是全局的. 之所以在当前的编程语言中, 全局变量与局部变量的明确不同, 则其实被当前的编程语言, 函数决定. 因为我们总是不得不在函数内, 或者函数外来定义变量, 没有其他的途径. 导致函数外的变量被生硬定义为全局, 而我们无法给予"变量生命期"概念. 这时, 我们不得不进行深思, 开始考虑, 如何设计一个系统, 在我们需要或者不需要时预约和释放 RAMDATA 呢? 而不是被迫于函数写法, 被迫决定为局部还是全局呢? ... 这时, 我们便要学习操作系统了吧.

allen_zhan_752827529 2013-12-5 11:47

在一般的各种语言编程 help document 中, 都有类似的说法, 其实应该是不建议使用全局变量吧? 而不是这里所说的"没有初始化全局变量". 我猜原因是否是, 2000年代初, SRAM 还是贵的, 资源还是尽量少的, 给 programer 的 RAM 是珍惜的. 所以被我们一旦预约了全局变量, 应该就是等同于占据了 RAM 中的空间. 这是否也意味着"设计的资源效率低下"? 推广到今天的 uController, 当我们使用时, 尽管我们享受着大容量(针对过去)的 RAM, 但是我们也不应该一时兴起, 无休止将大size 的数组定义成全局~~~ 反正这方便我们的代码 coding 不是吗? 但是大 size 的数组, 当然也必将导致可用的 RAM 的迅速降低, 很多时候, 我们茫茫然抬头发现 compiler 告诉我们 RAM 资源耗尽! 但是, 不管是全局的, 还局部的, 无论在哪里进行初始化, 都必然占据 ROMDATA 的. 当然了, 如果预约下全局的 RAMDATA, 而实际上不作初始化, 也事实上代码中发生疏漏, 没有应用, 那更算是粗心导致的大错, 无意义损耗 RAMDATA, 也许这就是所谓的避免定义全局数据的呼吁... 但是哪个心细的 programer 又会犯这种错误呢. 另外, 在某些编程指导书籍里面, 极度反对全局变量, 理由是对工程项目不利, 对团队合作编程不利, 这又是另一个 story 了. 完全不定义全局变量? 似乎在工程学上又走向另一个极端?

用户1556984 2013-12-4 19:52

废话,干过两年的单片机编程都知道的道理

用户1602177 2013-12-2 17:02

多谢分享~

用户1557117 2013-1-21 19:16

学习

用户1625603 2013-1-21 17:50

很好的一篇文章,讲述了汽车上的常用传感器

用户1679169 2013-1-21 16:00

不错

用户573499 2013-1-21 14:48

汽车方面的部件以及功能,一直都很感兴趣,这次来看看是什么东西

用户1408678 2013-1-21 13:17

很有建設性與實用性文章,未來汽車各種感應器是一定需要成長的且是多樣性
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
5
17
关闭 站长推荐上一条 /3 下一条