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