当前位置: 首页 > news >正文

单片机编程规范1 ---阮丁远 20260509

单片机编程规范1 ---阮丁远 20260509 :


1.只用静态数组+is被占用的标志位来 分配内存,不用malloc

2.读写带下标的参数前先验证下标大小范围是否对,比如有的下标只能1开始,因为0的话里面 0-1 就变为负数了

3.可以建立 参数 范围 监控线程,比如 变量只能为1-10的,如果变为0就异常,就强制改为1

4.只用裸机式的函数扫描执行+状态机方式的代码,不用任何阻塞式延时等待的代码

5.重要的数据可以存6-10份冗余备份,读取时读重复次数最多的那份,防止参数意外掉电时丢失

6.参数记忆和读写可以用如下的方式,批量写入 set_canshuo_value_bufs 的字节到储存器,读时用其botelv字段等来读即可:

union set_canshuo_value_info {
u16 set_canshuo_value_bufs[t_page_defs_count+1+addon_sets1_length];
struct {


uint16_t inited_flag; //0

uint16_t addr; //1
uint16_t botelv; //2


uint16_t guoya_fazhi; //3
uint16_t guoya_mode; //4
uint16_t guoya_Delay; //5

。。。。。。。。
}
}


7.简单的lcd屏幕菜单显示可以用 数据体 来配置每项菜单和每项菜单对应的储存器的参数记忆地址,这样无需每个菜单和参数记忆都独立的给其写代码,只需配置好菜单数据体即可,必要时可以设置 自定义界面的回调函数,和 按下设置键时的记忆回调函数,
或者用当前屏幕号+菜单深度值 方式来做界面显示


8.除零异常的分母预判断,数组下标溢出的判断

9.防止堆栈溢出,栈要设得足够大,高速中断的中断函数里尽量避免局部大变量的分配


10.通讯都得加crc16或32的错包判断

11.写24c32等时可以led快闪3下,来判断是否存在频繁写24c32等的bug,导致寿命耗尽

12.电能等累计类的数据永久存储时,可以考虑用寿命几万忆次的铁电存储器,每10秒存一次,每次冗余存6-10份,下次加载时取重复次数最高的那份,

13,对于是否已初始化过的判断标志位,如果标志位显示没初始化过,则再读5次,每次延时10ms,看是否每次都是读到没初始化过,防止不稳定而意外执行初始化出厂设置而丢参数!

14.上电要等10ms左右,等待外置的at24c32等存储器上电稳定,再去读

15. 上电要等100ms左右才合闸或判断各监控adc参数是否正常

16. 串口通讯用以下方式比较稳定:收到第一个字节后​,开始定时变量,这个变量每1ms加1,串口每收到一个新字节就这变量置为0,直到这个变量大于10ms就表示收到完整的一帧数据

17.多路adc采集可以用 adc+DMA方式自动循环采集方式比较好,

18.如果485的发送/接收模式控制脚接到了单片机,需要建立定时器做超时判断,如果很长时间每发送新数据了,就把
这个 485的发送/接收模式控制脚 的状态设为接收模式,防止死机或死锁后一直发送模式而占用485总线,导致也无法收到新数据来退出发送模式!

19.任何外置存储器的驱动代码都需要做测试,比如0-1000地址里分别写入0-1000,然后读出来,看是否对得上

20.做完项目后记得启用单片机的硬件看门狗

21.永久储存时,最好用u16类型的数据类型,就适合大部分参数了,而float类型可以用2个u16类型的数据来拼成,

22. 电压电流比例因子和短路倍数等重要的记忆参数都要做值范围判断,如果不在范围内,就默认加载默认的​电压电流比例因子值而放弃存储器里的电压电流比例因子值,

23.注意算法的cpu耗时和屏幕刷新cpu耗时等,要实时处理的全放到定时器中断里,不要轮询处理实时任务,比如adc采集完200个点(一个20ms周波)后的RMS有效值计算,采集时在定时器中断隔固定时间采集一次adc的DMA值,计算rms时可以在main函数里开个虚拟任务函数轮询计算,因为计算比较耗时,无法放中断里,中断采集完的信号可以弄个变量和main的rms计算函数通讯,

可以考虑采集200个点后(一个20ms周波),暂时暂停采集,等计算rms完成后再开始下一轮采集????,这样就不会因为rms计算慢,而边计算rms边覆盖adc的缓冲区的数据,

24.漏电限幅稳压管或温度限幅稳压管导致的潜在饱和误差

25.对于bug,要准备好一个目录和多个txt文件,及时记录自己代码的bug,或接手的别人代码的各种bug,要深信纸比脑好使,大脑容易忘了各种bug

http://www.jsqmd.com/news/855638/

相关文章:

  • jQuery虚拟键盘Keyboard无障碍访问(ARIA)实现:打造包容性Web应用
  • 2026浙江全日制文补学校推荐:浙江全日制文补机构推荐,闭眼选不踩坑 - 栗子测评
  • 109、滑模控制:抖振抑制方法
  • TMC8461/8462 EtherCAT从站控制器:集成实时控制与工业I/O的高性能方案
  • 别再死记公式了!用Python+SymPy自动推导星三角变换,附完整代码
  • 3步打造高效macOS菜单栏:Hidden Bar深度使用指南
  • Cakewalk编曲效率翻倍秘籍:巧用VMPK自定义键盘映射,打造你的专属快捷键
  • 【AI赋能测试笔记】5基于文档用例生成系统及skills
  • SINet-V2:高效隐蔽目标检测实战指南与深度解析
  • 从零开始学AI17——SVM的数学支撑知识
  • 2026金枪鱼罐头供应商指南汇总名录 - 栗子测评
  • Delphi二进制迷宫破解:IDR交互式重构器的逆向工程革命
  • php方案 原生协程支持(Fiber最佳实践完整的
  • RHEL9.6虚拟机安装配置攻略————安装虚拟机
  • LLM结构化输出工程:让模型输出你真正需要的格式
  • 【Perplexity天文知识搜索终极指南】:20年天体物理工程师亲授5大避坑法则与实时星图调用技巧
  • MTP:大模型推理提速黑科技(Multi-Token Prediction)
  • 告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码)
  • Windows Phone Internals深度解析:3层技术架构解锁Lumia设备的完整方案
  • 软件工程师在智能体视觉时代的机遇(19)
  • 【量化】Vision Transformer 的完全量化已经从简单的 CNN 方法移植,发展成为一个拥有丰富技术体系的独立研究方向:综述
  • 3种方法彻底解锁英雄联盟国服皮肤:R3nzSkin换肤工具完整指南
  • LTE/5G常见业务问题(比如速率低 /MOS<3/随机接入失败等 )排查思路和方法
  • 告别拓展坞!实测Spacedesk无线投屏:Win10/Win11到iPad的延迟、画质与触控体验全解析
  • 期刊推荐:SN Social Sciences(ISSN: 2662-9283)
  • 告别DHCP:ESXi 8.0安装后如何手动配置静态IP和管理网络
  • IPC如何查看照片缩略图及照片
  • Dify系列课程 - 6.本地Dify关联本地大模型 Deepseek
  • 13 极物科技 JetLinks MQTT:网关设备与网关子设备 - 温控设备场景
  • c#软件开发学习笔记--数据类型