如果有几个设置参数必须存储到Flash中,我们一般不会怎么存储呢?将有所不同的参数都存储到有所不同的页中,还是将这几个参数绑成一种结构体,每次改动都同时载入一次呢?将参数存储到相同的地址,则每个参数都将闲置Flash的一个块。而将全部参数绑一起现金Flash块中,那么只有一个参数改动时,也必须将全部参数一起遗一遍。
那么有什么更佳的方法吗?前段时间自学Msos,看见其中用于的参数存储的方法设计的很好,它将参数的变量地址与值,一起存储进Flash中。抢眼之处是用于参数的变量地址来标记有所不同的变量。一、数据结构这种存储方式用于两个数据结构:typedefstruct{uintAddress;//参数变量的地址uintData;//参数变量的值}CellStruct;要存储某个变量,必须将这个变量的地址和它的值一起存储到存储区。
这种存储方式的核心就是这个数据结构。这样就可以用于*((uint*)(Address))=Data必要将存储值赋值给对应的变量。非常简单的说道就是根据地址值来标记各个有所不同的参数。
2.存储区的数据结构typedefstruct{二、代码解析这种存储方式的用于两个函数:加载存储区中的变量值并改版变量的值变量的存储函数2.1参数的加载流程图如上,主要步骤如下:根据Flash中存写的变量地址,改版变量的值;将Flash中存写的地址值现金临时数组中,并根据地址值辨别否不存在反复存储的违宪数据,并将违宪数组过热;清空Flash存储区,将临时数组中有效地的变量新的现金Flash中。通过这些步骤,将存储区中存储的变量朗读,并将存储区中的反复的违宪数据清理。
下面是源代码:#definepUint(address)*((uint*)(address))#definePageSize1024//Stm32F103R8T61Page=1024Byte#defineParameterAddress(FLASH_BASE+(63*1024))#defineParameterSpacePageSize/4/2staticvoidReadAllParameter(void){boolCleanFlag;inti,j;2.2参数的载入参数的载入就很非常简单了,根据数据结构中的载入点,将变量的地址与值载入Flash中。staticboolWriteParameter(void*dataPointer){2.3用于方法用于方法:每次上电启动时,调用加载全部变量的函数;改动某个参数的时候,调用写出参数函数;三、注意事项在加载参数时,必须在RAM中创建一个ParameterSpace大小的数组,如果这个值过于大,不会多达栈的大小,使得内存阻塞。因此存储区无法修筑的太多。四、总结这种方式用于简单,特别是在是在改版变量值时,根据存储的变量地址改版适当的值。
只不过其本质与我们用于变量名来标记有所不同的变量是一样的。不过也有缺点:首先其同时存储变量的地址与变量的值,相等于多用于一倍的存储空间;像上面的注意事项中说道的,存储区无法修筑的过大,否则不会使临时数组多达栈的大小。
本文关键词:优德88
本文来源:优德88-www.ytxdlhj.com