学习STM32也会遇到这样的绝对定位的问题如下:绝对地址定位
uint8_t UART_RX_BUF[1024] __attribute__ ((at(0X20001000))); //就是将串口接收的数据定位到RAM中起始地址为0X20001000;
绝对定位要么定位到flash、要么定位到RAM,这里我们将定位在flash进行说明
通过上面的分析可以看出 UCOSIII 的内 存管理很粗糙,不灵活,不能申请指定大小的内存块,
正点原子的malloc.c代码可以实现动态内存的使用,比自带的函数更加灵活
//偏上SRAM 64K
OS_MEM OS_MEM_INTERNAL;
#define OS_MEM_INTERNAL_BLOCK_NUM 5
#define OS_MEM_INTERNAL_BLOCK_SIZE 100
__align(4) unsigned char OS_MEM_INTERNAL_BLOCK[OS_MEM_INTERNAL_BLOCK_NUM][OS_MEM_INTERNAL_BLOCK_SIZE];
//外扩SRAM 1G
OS_MEM OS_MEM_EXTERNAL;
#define OS_MEM_EXTERNAL_BLOCK_NUM 5
#define OS_MEM_EXTERNAL_BLOCK_SIZE 100
__align(32) volatile unsigned char OS_MEM_EXTERNAL_BLOCK[OS_MEM_EXTERNAL_BLOCK_NUM][OS_MEM_EXTERNAL_BLOCK_SIZE] __attribute__((at(0X68000000)));
//创建存储分区 内部sram
OSMemCreate((OS_MEM *)&OS_MEM_INTERNAL,
(CPU_CHAR *)"OS_MEM_INTERNAL",
(void *)&OS_MEM_INTERNAL_BLOCK[0][0],
(OS_MEM_QTY )OS_MEM_INTERNAL_BLOCK_NUM,
(OS_MEM_SIZE )OS_MEM_INTERNAL_BLOCK_SIZE,
(OS_ERR *)&err);
//创建存储分区 外部sram
OSMemCreate((OS_MEM *)&OS_MEM_EXTERNAL,
(CPU_CHAR *)"OS_MEM_EXTERNAL",
(void *)&OS_MEM_EXTERNAL_BLOCK[0][0],
(OS_MEM_QTY )OS_MEM_EXTERNAL_BLOCK_NUM,
(OS_MEM_SIZE )OS_MEM_EXTERNAL_BLOCK_SIZE,
(OS_ERR *)&err);
申请内存:OSMemGet
internal_buf = OSMemGet((OS_MEM *)&OS_MEM_INTERNAL,
(OS_ERR *)&err);
printf("申请内部sram,addr= %d\r\n",(u32)internal_buf); //打印该指针,即地址
if(err == OS_ERR_NONE)
{
internal_mem_get_num++;
printf("use 内部 sram %d times\r\n",internal_mem_get_num);
}
else if(err == OS_ERR_MEM_NO_FREE_BLKS)
{
printf("内存块不足\r\n");
}
释放内存:OSMemPut
OSMemPut((OS_MEM *)&OS_MEM_INTERNAL,
(void *)internal_buf,
(OS_ERR *)&err);
printf("internal_buf 内存释放之后地址为:%d",(u32)(internal_buf));