- 主题:Re: 如何确保对常值数组全部赋值为同一个字节?
memset 吧
【 在 feiy 的大作中提到: 】
: 对变量的赋值上,如果实现全数值赋值?
: 比如,定义了一个数据结构
: typedef union {
: ...................
--
FROM 115.171.63.*
做个初始化函数
【 在 feiy 的大作中提到: 】
: 对变量的赋值上,如果实现全数值赋值?
: 比如,定义了一个数据结构
: typedef union {
: ...................
--
FROM 42.249.53.*
可以用宏来实现,如下:
#define REP1 0xAA
#define REP2 REP1, REP1
#define REP4 REP2, REP2
#define REP8 REP4, REP4
const uint8_t rsvd8[8] = {REP8};
const uint8_t rsvd9[9] = {REP8, REP1};
怕麻烦,你也可以用条件编译,把填充的个数转换成二进制,再自动套用上面的宏。
另外,我估计用scatter文件可以实现,你可以研究下。
--
FROM 103.90.191.*
memset(****.reserved, 0xaa, sizeof(****.reserved))
不就行了
【 在 feiy (null) 的大作中提到: 】
对变量的赋值上,如果实现全数值赋值?
比如,定义了一个数据结构
typedef union {
u8 data[1024];
struct{
u8 var1
...
u8 varn;
u8 reserved[这里的长度会根据上述变量计算]
}sdata;
}STR_DATA;
简单地说,就是定义了固定长度的数据结构,保留去为了扩展用。
然后声明了一个常值,作为保存在flash的里缺省赋值
const STR_DATA strData ={
.sdata.var1 = xx1,
.....
.sdata.varn = xxn,
.sdata.reserved[]={0xAA}
};
注意最后一行,本意是将这个常值缺省的保留未用的区间,都赋值为0xAA
但是编译后的结果,实际是reserved[0]=0xAA,后面的全都是0了。
请问,这里有什么好的方法(比如宏定义,或者编译选项)可以实现将reserved[]全部
赋值为0xAA吗?
当然,手动本方法去全部赋值,也是可以的,但是不想每次添加几个成员变量后,都得
去改这里。
谢谢!
--
FROM 106.121.65.*
多长啊?
既然知道是重复某一个值,那还用这么搞吗,浪费flash
如果是特定数据的话倒是还可以直接放个二进制文件,然后用.incbin来实现
【 在 feiy (null) 的大作中提到: 】
常值数组的赋值,编译的时候,直接放在FLASH里的那种。
【 在 tom6bj 的大作中提到: 】
: memset(****.reserved, 0xaa, sizeof(****.reserved))
: 不就行了
:
: ...................
--来自微水木3.5.8
--
FROM 106.121.65.*
这个只能全0或者全1吧
【 在 dormouseBHU 的大作中提到: 】
: memset 吧
: 【 在 feiy 的大作中提到: 】
: : 对变量的赋值上,如果实现全数值赋值?
: ....................
- 来自「最水木 for iPhone13,4」
--
FROM 223.104.131.*
Makefile 直接改hex文件
【 在 feiy (null) 的大作中提到: 】
: 常值数组的赋值,编译的时候,直接放在FLASH里的那种。
: --来自微水木3.5.8
--
FROM 27.38.237.*
纯C源码,只允许修改字段,只能看看有没有什么编译器扩展可供利用。
sizeof或类似操作是编译期的事情,预处理阶段没办法搞。
如果允许人工计算或者少量改代码,那可以:
- 用宏之类,可以跨编译器
- GCC之类的有{[A ... B] = N}这种初值扩展
允许使用链接脚本之类的话,那么
1,结构体单门放一个section
2,linker脚本,比如binutils的ld,section有fill字段,未用部分可填充指定数据
【 在 feiy (null) 的大作中提到: 】
: 对变量的赋值上,如果实现全数值赋值?
: 比如,定义了一个数据结构
: typedef union {
: ...................
--
修改:zkr FROM 123.118.98.*
FROM 123.118.98.*