帮忙解析一个EXAM8里面的定义语句

UINT8 xdata FileDataBuf[0x4000]; /* 文件缓冲区,太小则速度慢 */

这个是EXAM8里面的定义语句。下面语句用到了FileDataBuf,这应该是个地址,那为什么定义成0x4000呢?

s = CH376SecWrite( FileDataBuf, s, NULL ); /* 以扇区为单位向文件写入数据,写入缓冲区中的所有数据,含最后的零头 */ 这句是什么意思,是C51单片机特有的命令吗? 定义的 FileDataBuf[0x4000] 是坐什么用的? 求解释啊。

当我把上面xdata删掉 进行UINT8 FileDataBuf[0x4000]; 定义时, 报错提示: : warning: #223-D: function "CH376SecWrite" declared implicitly : warning: #167-D: argument of type "UINT8 *" is incompatible with parameter of type "char *restrict"

file_sys.h 我肯定引进来了,因为其他函数都没问题。


你用的什么单片机?FileDataBuf是你要写的数据存放地


上面就是开辟了一个缓冲区,按照你上面的警告来看是指针类型有问题。


我用的是stm32f103vet的单片机,512kB Flash, 64KB RAM,请问应该怎么设置FileDataBuf[0x4000], 这个数据存放地一般都是放在flash的吗?


你可以放在外部RAM中,把FileDataBuf[0x4000]放在外部RAM或者你的RAM中


uint8_t buf[64]; uint16_t total; /* 记录当前缓冲在FILE_DATA_BUF中的数据长度 */ uint32_t NewSize; /* 临时变量 */ uint8_t FileDataBuf[0x4000]; /* 文件缓冲区,太小则速度慢 */

total += sprintf( FileDataBuf + total, "在本次添加数据之前,该文件已有数据的长度是 %ld 字节\xd\xa", NewSize ); /* 将新数据添加到缓冲区的尾部,累计缓冲区内的数据长度 */

warning: #167-D: argument of type "UINT8 *" is incompatible with parameter of type "char *restrict" 这个报错到底是怎么回事啊,急啊...


定义的数据类型不匹配,这个需要根据你单片机的特性,还有编译器修改,具体我不清楚。总的来说你只需要把FileDataBuf[0x4000]放到你的RAM中,不能放到FLASH


看下这个函数"sprintf"原型的申明。是指针类型有问题,这样修改下看是否可以: sprintf( (char *restrict)&FileDataBuf + total, "在本次添加数据之前,该文件已有数据的长度是 %ld 字节\xd\xa", NewSize ); /* 将新数据添加到缓冲区的尾部,累计缓冲区内的数据长度 */

KEIL对指针类型的判断比较严格,所以对于不同的数组类型都会提示警告。


多谢了, 最后一句话帮到我了,KEIL对指针类型的判断比较严格,所以对于不同的数组类型都会提示警告。 之前,链接时无法通过,我以为是编译的警告造成的,最后发现令有原因,所以这几个警告应该不会影响,正如大神说的最后一句话。 你上面的修改内容 我试了,貌似还是有警告。


如果还有警告应该不会影响到使用,或者你换一个函数使用。这样应该就可以了。


确实不影响使用,那就不换了,因为也不知道与之类似的其他函数了。多谢了。


只有登录才能回复,可以选择微信账号登录