我正在尝试使用arduino IDE编写草图。我在progmem中有数据,并希望将带有函数的数据移动到使用malloc分配的内存地址。我的代码如下:
const uint8_t Data_6 [256] PROGMEM = { 0x11, 0x39......};
void setup() {
Serial.begin(57600);
oddBallData (Data_6, 0x00, 256);
}
void main() {
}
void oddBallData(const uint8_t *data, uint8_t mem, uint16_t bytes) {
uint8_t *buff1 = (uint8_t*)malloc(sizeof(bytes));
if (buff1 = 0) {
Serial.println(F("FATAL ERROR - NO MEMORY"));
}
else {
for (uint16_t x = 0; x < 6; x++ ) {
buff1[x] = data[x]; //edited from data[0] to [x] made a mistake in post
Serial.println(buff1[x],HEX);
}
}
buff1[0] = data[0];
Serial.println(buff1[0],HEX);
free(buff1);
}
我在progmem中保存了一些数据,并希望使用i2c协议将该数据写入第二个设备。我有多个常量数据保存到我的progmem,具有不同的大小。所以我使用了malloc来保留函数内部堆的一些内存。
我无法从progmem写入数据,所以我已经删除了一些内容,以便我只是尝试使用malloc指向progmem数据然后打印它。
这是我发现问题的地方。如果我从数据常量打印单个数组条目。它打印正确的值。如果我使用循环我得到混合结果,只要条件检查值低于3或有时低于6 !!!循环就可以工作。 如果高于此值,整个打印只是垃圾。任何人都可以解释我所看到的吗?
答案 0 :(得分:1)
罪魁祸首可能是
uint8_t *buff1 = (uint8_t*)malloc(sizeof(bytes));
sizeof(bytes)
返回变量的大小(可能是2个字节),因此您只需分配2个字节的内存。您应该直接使用该值,例如:
uint8_t* buff1 = malloc(bytes);
请注意,C 中不需要强制转换,因为void*
可以直接转换为任何其他指针类型。
答案 1 :(得分:0)
答案 2 :(得分:0)
再次 - AVR PROGMEM
不能直接从内存空间访问,它需要不同的指令而不是访问RAM
。如果你这样使用它,你将获得传递地址的RAM
内容,而不是FLASH
。你必须使用特殊功能。例如,memcpy_P(ram_buff,flash_ptr);
从flash中复制到ram中。或者您可以按pgm_read_byte(flash_ptr + offset)
BTW:如果你正在使用Data_6[0]
并且它正在工作,那只是因为编译器将其视为常量,并且常量可以由其值编译时间替换。