【UCOSIII】【OS内存管理】内部SRAM64K、外部SRAM1M、OSMemGet、OSMemPut

 学习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));



猜你喜欢

转载自blog.csdn.net/qq1518572311/article/details/80568353