#include "INCLUDES.h"
#define TASK_STK_SIZE 512 /* 任务堆栈长度*/
OS_STK StartTaskStk[TASK_STK_SIZE]; /*定义任务堆栈区 */
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_MEM *IntBuffer; //定义内存控制块指针,创建一个内存分区时,返回值就是它
INT8U IntPart[50][64]; //划分一个具有50个内存块,每个内存块长度是60的内存分区
INT8U *IntBlkPtr; //定义内存块指针
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); /* 声明任务 */
/*
*********************************************************************************************************
* MAIN主函数
*********************************************************************************************************
*/
void main (void)
{
OSInit(); /* 初始化uC/OS-II */
PC_DOSSaveReturn(); /* 保存DOS环境 */
PC_VectSet(uCOS, OSCtxSw); /* 安装uC/OS-II的中断 */
IntBuffer=OSMemCreate(IntPart,50,64,&err); //创建动态内存区
OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数
OSStart(); /* 启动多任务管理 */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key; /*用于退出的建*/
pdata = pdata; /* Prevent compiler warning */
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); //创建任务
for (;;) {
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS */
}
}
OSTimeDlyHMSM(0, 0, 3, 0); /* Wait 3s */
}
}
/*--------------------MyTask任务-------------------------*/
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for( ; ; )
{
IntBlkPtr=OSMemGet(IntBuffer,&err); //请求内存块
*IntBlkPtr=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); //释放内存块
OSTimeDlyHMSM(0,0,1,0); //等待1s
}
}
以上是源代码。小弟请问大家一个问题
运行一次Mytask,任务申请了两个内存块,那么后面
IntBlkPtr--;
OSMemPut(IntBuffer,IntBlkPtr);
运行后,释放的是内存块1,还是内存块2 ?
还有就是如果释放的内存块1,那么释放之后IntBlkPtr是自动指向内存块2吗?
如果释放的是内存块2 呢?