嵌入式软件开发----编程思想

(1)创建结构体,如果需要将该结构体重新写入Flash,则可以在首尾端添加MagicStartNum和MagicEndNum。是为了作为Flash是否被擦除过的标记,前后都加是为了防止在擦除到一半后被断电。


(2)在编程中,如果用到经常需要被修改的定值时,需要用宏定义,即为了方便修改,也为了方便他人阅读。


(3)在需要成块状存储不同类型的数据时,struct是个非常好的选择。


(4)所有的配置均以宏定义代替,方便理解及修改


(5)在配置软件资源时,可公用的函数,可以直接用宏定义代替,不同定义间可以用“##”来连接,实现代码公用


(6)配置定时器:先定义一个寄存器结构体--->然后将这个结构体指向一个定时器基地址--->对结构体进行操作即可


(7)配置通用GPIO:当需要将多个IO口进行相同配置时,可以将配置代码定义成宏定义,然后预留接口,通过“##”连接成宏定义的样子,实现代码公用


(8)创建一个指针指向FLASH的空地址

判断该地址以及该地址后需要的区域是否全部为0xFF,若不是,则说明重新有写入配置信息,读出来后配置Modbus;若是,则说明第一次上电,执行全部存储数据到FLASH


(9)在开发时,尽量降低代码的重复率,提高公用性,且尽量保证每一段代码长度不要超过50行。


(10)存储区域划分可参考如下方案:

boot-----[0x0,0x6FFF]

save-----[0x7000-0x7FFF]

app -----[0x8000,**]


(11)FLASH只能将1写0,不能由0写1 ,所以在写入之前,必须先擦除,即全部置1,内存块中均为0xFF


(12)拿到一份代码,先看中断处理!!!(事件触发、时间触发)

在每一个工程中都包含.s文件,在.s文件中,可以找到相应的中断处理函数的函数名,通过函数名查询可锁定中断处理函数的位置。


(13)写FLASH出错排查:

1)检查写FLASH错误码

2)存储区域分RAM1和RAM2,有些RAM可能不支持写入FLASH

3)可以通过

SAVE_PARAM Param __attribute((at(0x10000000)));

强制变量存放在RAM1,然后写入FLASH
 

原创文章 18 获赞 12 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28086285/article/details/88691067