中科因仑“3+1”工程特种兵精英论坛
标题: ucos-ii学习笔记——动态内存分配原理及使用 [打印本页]
作者: leixiaofeng 时间: 2015-4-13 21:08
标题: ucos-ii学习笔记——动态内存分配原理及使用
ucos-ii学习笔记——动态内存分配原理及使用
Created on: 2012-10-8
Author: zhang bin
学习笔记
for ucos-ii PC
redesigned by zhang bin
2012-10-8
All Rights Reserved
#include "INCLUDES.h"
#define TASK_STK_SIZE 512
OS_STK StartTaskStk[TASK_STK_SIZE];
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_MEM *IntBuffer; //定义内存控制块指针,也即是指向内存分区的指针,创建一个
//内存分区时,返回值就是它 OS_MEM 内存控制块类型的指针
INT8U IntPart[50][64]; //划分一个具有50个内存块,每个内存块长度是64个字节的内存分区
INT8U *IntBlkPtr; //定义内存块指针 无符号char型的
char *s1= "Mytask is running";
//char *s2= "Youtask is running";
//char *s3= "Hertask is running";
INT8U err; //存放错误信息
INT8U y=0; //字符显示位置
void StartTask(void *data);
void MyTask(void *data);
void main (void)
{
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
IntBuffer=OSMemCreate(IntPart,50,64,&err); //创建动态内存区 函数参数为:IntPart为内存分区的起始地址
//前面已经定义了INT8U IntPart[50][64];表示内存分区,用数组名表示起始地址
//第二个参数50表示分区中内存块的数目,第三个参数64表示每个内存块的字节数,最后&err为错误信息
//上面也定义了INT8U err; //存放错误信息
//函数的返回值为创建的内存分区的指针,为OS_MEM 内存控制块类型的指针,上面定义了
//OS_MEM *IntBuffer; //定义内存控制块指针
OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始任务
OSStart();
}
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
OSTaskCreate(MyTask, (void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 3); //创建任务MyTask
for (;;)
{
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for( ; ; )
{
IntBlkPtr=OSMemGet(IntBuffer,&err); //请求内存块 从已经建立的内存分区中申请一个内存块
//函数的参数为指向内存分区的指针,上面已经创建了内存分区IntBuffer
//函数的返回值为内存块指针,上面定义了 INT8U *IntBlkPtr; //定义内存块指针 无符号char型的
*IntBlkPtr=1; //在申请到的内存块中存入1
//注意,应用程序在使用内存块时,必须知道内存块的大小,并且在使用时不能超过该容量
PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); //显示信息
*++IntBlkPtr=2; //???
PC_DispStr(*IntBlkPtr*10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
IntBlkPtr--; //???
OSMemPut(IntBuffer,IntBlkPtr); //释放内存块 当应用程序不再使用这个内存块后,必须及时把它释放,
//重新放入相应的内存分区中
//函数中的第一个参数IntBuffer为内存块所属的内存分区的指针,IntBlkPtr为待释放内存块指针
//在使用函数OSMemPut()释放内存块时,一定要确保把该内存块释放到它原来所属的内存分区中
//否则会引起灾难性的后果
OSTimeDlyHMSM(0,0,1,0); //等待1s
}
}
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) |
Powered by Discuz! X3.4 |