(uC/OS-II学习笔记) 内存管理
原文来源:
http://www.cnblogs.com/hebaichuanyeah/
ANSI C中,malloc()和free()可以动态分配和释放内存,malloc和free会把内存分割成多个不相邻的的小内存碎片。因为malloc分配内存空间并不固定,执行时间也不确定。
uC/OS-II中OSMemGet()和OSMemPut()执行类似的内存分配工作。因为分配和释放固定且连续的内存空间,故时间确定且不会产生多个内存碎片。
在主函数中创建任务及定义相关变量。
OS_STK Task1_Stk[512]; U8 MyMemory[100][64]; volatile OS_MEM * MyRoom; void main() { U8 err; OSInit(); //初始化uC/OS MyRoom = OSMemCreate(&MyMemory[0][0],100,64,&err); OSTaskCreate(Task_1,(void *)0,&Task1_Stk[STARTUP_TASK_STK_SIZE-1],5); OSStart(); //启动多任务管理 }
任务
extern volatile OS_MEM * MyRoom; void Task_1(void *pdata) { U8 err,Count; U8 * Mem_Guide; char Str[] = "I receive a memory "; #if OS_CRITICAL_METHOD == 3 //关中断的方法为3 OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); OS_CPU_SysTickInit(100000000/OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); //统计任务 优先级最低 pdata = pdata; UART4_Init(115200); Mem_Guide = OSMemGet((OS_MEM *)MyRoom,&err); while(1) { for(Count=0;Str[Count];Count++) Mem_Guide[Count] = Str[Count]; for(Count=0;Mem_Guide[Count];Count++) Uart4_SendByte(Mem_Guide[Count]); //OSMemPut((OS_MEM *)MyRoom,&Mem_Guide[0]); OSTimeDly(1000); } }
运行结果
原文来源: