四.内存管理应用代码(基于stm32f4)
/**********UCOSII任务堆栈设置*****************/
//1.START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 128
//创建任务堆栈空间
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数接口
void start_task(void *pdata);
//2.main_task主任务
//任务优先级
#define MAIN_TASK_PRIO 4
//任务堆栈大小
#define MAIN_STK_SIZE 128
//任务堆栈
OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
//任务函数
void main_task(void *pdata);
//3.memmanage_task内存管理任务
//任务优先级
#define MEMMANAGE_TASK_PRIO 5
//任务堆栈大小
#define MEMMANAGE_STK_SIZE 128
//任务堆栈
OS_STK MEMMANAGE_TASK_STK[MEMMANAGE_STK_SIZE];
//任务函数
void memmanage_task(void *pdata);
/********************定义存储区**********************/
//定义一个存储区(内部)
OS_MEM *INTERNAL_MEM; //定义内存控制块指针
//存储区中存储块数量
#define INTERNAL_MEM_NUM 5
//每个存储块大小
//由于一个指针变量占用4字节所以块的大小一定要为4的倍数
//而且必须大于一个指针变量(4字节)占用的空间,否则的话存储块创建不成功
#define INTERNAL_MEMBLOCK_SIZE 100
//存储区的内存池,使用内部RAM
u8 Internal_RamMemp[INTERNAL_MEM_NUM][INTERNAL_MEMBLOCK_SIZE]; //划分分区及内存块
//定义一个存储区(外部)
OS_MEM *EXTERNAL_MEM; //定义内存控制块指针
//存储区中存储块数量
#define EXTRENNAL_MEM_NUM 5
//每个存储块大小
//由于一个指针变量占用4字节所以块的大小一定要为4的倍数
//而且必须大于一个指针变量(4字节)占用的空间,否则的话存储块创建不成功
#define EXTERNAL_MEMBLOCK_SIZE 100
//存储区的内存池,使用外部SRAM(位置:0X68000000)
u8 External_RamMemp[EXTRENNAL_MEM_NUM][EXTERNAL_MEMBLOCK_SIZE] __attribute__((at(0X68000000)));//划分分区及内存块
/********************main主函数**********************/
int main(void)
{
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //key初始化
LCD_Init(); //LCD初始化
FSMC_SRAM_Init(); //初始化SRAM
ucos_load_main_ui(); //加载主UI1
OSInit(); //初始化UCOSII
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart(); //开始执行UCOS程序
}
//开始任务
void start_task(void *pdata)
{
u8 err;
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
//创建一个内部存储分区
INTERNAL_MEM=OSMemCreate(Internal_RamMemp,INTERNAL_MEM_NUM,INTERNAL_MEMBLOCK_SIZE,&err);
//创建一个外部存储分区,使用外部SRAM(位置:0X68000000)
EXTERNAL_MEM=OSMemCreate(External_RamMemp,EXTRENNAL_MEM_NUM,EXTERNAL_MEMBLOCK_SIZE,&err);
OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO); //在开始任务中创建main任务
OSTaskCreate(memmanage_task,(void *)0,(OS_STK*)&MEMMANAGE_TASK_STK[MEMMANAGE_STK_SIZE-1],MEMMANAGE_TASK_PRIO); //在开始任务中创建memmanage_task任务
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//主任务的任务函数(完成内存的申请及释放)
void main_task(void *p_arg)
{
u8 key,num,i=0;
static u8 external_memget_num;
u8 *internal_buf[5];
u8 *external_buf;
u8 err;
while(1)
{
key = KEY_Scan(0); //扫描按键
switch(key)
{
case WKUP_PRES: //按下KEY_UP键:申请内部内存
for(i=0;i<5;i++)
{
internal_buf=OSMemGet(INTERNAL_MEM,&err); //循环申请五次内存并放在internal_buf缓存区内
if(err == OS_ERR_NONE) //内存申请成功
{
sprintf((char*)internal_buf,"internal_buf[%d]=%d\r\n",i,i);//在申请到的内存区域内放置数据
printf("%s",internal_buf); //显示出来
printf("internal_buf[%d]内存申请之后的地址为:%#x\r\n",i,(u32)(internal_buf));
printf("internal_buf[%d]内存申请成功!\r\n",i);
}
else if(err == OS_ERR_MEM_NO_FREE_BLKS) //内存块不足
{
LCD_ShowString(30,180,200,16,16,"INTERNAL_MEM Empty! ");
}
delay_ms(500); //延时500ms,也就是每500ms申请一次内存,共五次
}
break;
case KEY1_PRES:
for(i=5;i>0;i--)
{
if(internal_buf[i-1] != NULL) //internal_buf不为空就释放内存
{
OSMemPut(INTERNAL_MEM,internal_buf[i-1]);//循环5次释放内部内存
printf("internal_buf[%d]内存释放之后的地址为:%#x\r\n",i-1,(u32)(internal_buf[i-1]));
printf("internal_buf[%d]内存释放成功!\r\n",i-1);
internal_buf[i-1]=NULL; //释放后的缓存区指向NULL!
}
else if(internal_buf[i-1] == NULL) //内存已释放
{
LCD_ShowString(30,180,200,16,16,"INTERNAL_MEM released! ");
}
delay_ms(500); //延时500ms,也就是每500ms申请一次内存,共五次
}
break;
case KEY2_PRES: //按下KEY2键:申请外部内存
external_buf=OSMemGet(EXTERNAL_MEM,&err);
if(err == OS_ERR_NONE) //内存申请成功
{
printf("external_buf内存申请之后的地址为:%#x\r\n",(u32)(external_buf));
LCD_ShowString(30,260,200,16,16,"Memory Get success! ");
external_memget_num++;
POINT_COLOR = BLUE;
sprintf((char*)external_buf,"EXTERNAL_MEM Use %d times",external_memget_num);
LCD_ShowString(30,276,200,16,16,external_buf);
POINT_COLOR = RED;
}
if(err == OS_ERR_MEM_NO_FREE_BLKS) //内存块不足
{
LCD_ShowString(30,260,200,16,16,"EXTERNAL_MEM Empty! ");
}
break;
case KEY0_PRES:
if(external_buf != NULL) //external_buf不为空就释放内存
{
OSMemPut(EXTERNAL_MEM,external_buf);//释放外部内存
printf("external_buf内存释放之后的地址为:%#x\r\n",(u32)(external_buf));
LCD_ShowString(30,260,200,16,16,"Memory Put success! ");
}
break;
}
num++;
if(num==50)
{
num=0;
LED0 = ~LED0;
}
delay_ms(10); //延时10ms
}
}
//内存管理任务(显示总的内存缓存块数以及剩余缓存块的数)
void memmanage_task(void *p_arg)
{
LCD_ShowString(5,164,200,16,16,"Total: Remain:");
LCD_ShowString(5,244,200,16,16,"Total: Remain:");
while(1)
{
POINT_COLOR = BLUE;
LCD_ShowxNum(53,164,INTERNAL_MEM->OSMemNBlks,1,16,0);
LCD_ShowxNum(125,164,INTERNAL_MEM->OSMemNFree,1,16,0);
LCD_ShowxNum(53,244,EXTERNAL_MEM->OSMemNBlks,1,16,0);
LCD_ShowxNum(125,244,EXTERNAL_MEM->OSMemNFree,1,16,0);
POINT_COLOR = RED;
delay_ms(100); //延时100ms
}
}
|