单片机NV区连续读写的操作及 Segment XDATA_HEAP must be defined in a segment definition option (-Z, -b or -P) 

134 阅读1分钟
stm32写:
       uint8_t* flash_buff;   
       uint8_t flash_data[50];

       HAL_FLASH_Unlock();
	   //HAL_FLASH_OB_Unlock();
  	    flash_buff = (uint8_t *)malloc(200); // 分配200个字节的内存空间,用来存放wifi信息(100)和TCP信息(50)
		memcpy(flash_buff, CWJAP, strlen(CWJAP)+2);//存入写入缓存区
		memcpy(flash_buff+100, CIPSTART, strlen(CIPSTART)+2);//存入写入缓存区
		flash_data[0] = Tis_Dis_Sta.BuzzerEnableFlag;//蜂鸣器使能模式
		flash_data[1] = Tis_Dis_Sta.IFREnableFlag;//红外模式
		flash_data[2] = Tis_Dis_Sta.Paper_OUT_Unit;//出纸单元
		flash_data[3] = Ser_REC_Flag.Wireless_Mode;//服务器通讯模式
		memcpy(flash_buff+150, flash_data, 49);//存入写入缓存区
			
		if(Flash_If_Erase(FLASH_DATA_ADDR) == FLASH_OK)//擦除地址所在的页
		{
			if(Flash_If_Write(flash_buff, FLASH_DATA_ADDR, FLASH_LEN) == FLASH_OK)//写入
			{
				BUZ_PRO_FUN(4,0);//蜂鸣器提示4次
			}
			else BUZ_PRO_FUN(2,0);//蜂鸣器提示2次
		}
	    free(flash_buff);  // 释放内存空间
	    //HAL_FLASH_OB_Lock();
	    HAL_FLASH_Lock();
stm32读:
     HAL_FLASH_Unlock();
	 flash_buff = (uint8_t *)malloc(FLASH_LEN);
     Flash_If_Read(flash_buff, FLASH_DATA_ADDR, FLASH_LEN);
     memcpy(CWJAP, flash_buff, 100);  

cc2530:参考

cc2530用malloc申请堆内存出现 Fatal Error[e72]: Segment XDATA_HEAP must be defined in a segment definition option (-Z, -b or -P)  的原因

 * malloc, calloc, realloc and free are only available if
* extern data (xdata) memoty is available. The Heap must
* be located in __xdata or __far memory.

 

cc2530用malloc申请堆内存的原因:如果定义的是全局变量,这个时候内存使用的是堆的存储方式,这个时候内存分配的空间不再连续,而是类似于链表的形式,而如果不连续,多个字节存nv时,zigbee栈提供的osal_nv_write的形参就搞不定

解决方法:用osal_mem_alloc申请内存 osal_mem_free释放 uint8* rxbuf = osal_mem_alloc(rxbuflen);   ····osal_mem_free(rxbuf);

NV区的Item并不和flash的物理地址一样,Item是索引,它下面可以有多个字节内容;而且

item的大小初始以后,就不能再改变了

范围是 0x0201 到 0x0FFF 段  NV数据是保存在flash的最后8个page中,共16K