假如几个设定参数务必储存到Flash中,大家一般不容易如何储存呢?将有所不同的参数都储存到有所不同的页中,還是将这好多个参数扎成一种建筑结构,每一次修改都另外加载一次呢?将参数储存到同样的地址,则每一个参数都将闲置不用Flash的一个块。而将所有参数绑一起现钱Flash块中,那麼只有一个参数修改时,也务必将所有参数一起遗一遍。那麼有哪些更优的方式吗?前不久通过自学Msos,看到在其中用于的参数储存的方式设计方案的非常好,它将参数的变量地址与值,一起储存进Flash中。引人注意的地方是用于参数的变量地址来标识有所不同的变量。
一、算法设计这类储存方法用于2个算法设计:typedefstruct{uintAddress;//参数变量的地址uintData;//参数变量的值}CellStruct;要储存某一变量,务必将这一变量的地址和它的值一起储存到储存区。这类储存方法的关键就是这个算法设计。
那样就可以用于*((uint*)(Address))=Data必需将储存值取值给相匹配的变量。比较简单的讲到便是依据地址值来标识每个有所不同的参数。
2.储存区的算法设计typedefstruct{二、编码分析这类储存方法的用于2个涵数:载入储存区中的变量值并改版变量的值变量的储存涵数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大小的数组,假如这一值过度大,不容易高达栈的尺寸,促使运行内存堵塞。因而储存区没法修建的过多。
四、汇总这类方法用于简易,特别是在是在改版变量值时,依据储存的变量地址改版适度的值。只不过是其实质与大家用于变量名来标识有所不同的变量是一样的。但是也是有缺陷:最先其另外储存变量的地址与变量的值,相当于多用于一倍的储存空间;像上边的常见问题中讲到的,储存区没法修建的太大,不然不容易使临时性数组高达栈的尺寸。
本文关键词:开云体育入口
本文来源:开云体育入口-www.rongshenghg.com