在函数

时间:2016-10-06 18:06:50

标签: arduino

我正在尝试使用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 !!!循环就可以工作。 如果高于此值,整个打印只是垃圾。任何人都可以解释我所看到的吗?

3 个答案:

答案 0 :(得分:1)

罪魁祸首可能是

uint8_t *buff1 = (uint8_t*)malloc(sizeof(bytes));

sizeof(bytes)返回变量的大小(可能是2个字节),因此您只需分配2个字节的内存。您应该直接使用该值,例如:

uint8_t* buff1 = malloc(bytes);

请注意,C 中不需要强制转换,因为void*可以直接转换为任何其他指针类型。

答案 1 :(得分:0)

我猜你刚忘了flush()

Serial.flushI()

之后尝试Serial.println(buff1[x],HEX);

您还可以查看flush documentation

答案 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]并且它正在工作,那只是因为编译器将其视为常量,并且常量可以由其值编译时间替换。