共2条
1/1 1 跳转至页

问
在http://www.zlgmcu.com网站的专栏上下载了一份uc/os在Keil上的移植程序,作了一些应用的改动,主要是想验证一下使用uc/os的内存管理,在这里我使用任务1分配一块内存,然后发送相应的消息,在任务2中接收相应的消息,释放分配的内存,发现发配的内存指针在传递的过程中被更改,不知到是为什么?能帮助解释一下吗?谢谢!
void Task1(void xdata * ppdata) reentrant
{
unsigned char err;
stryy xdata* kk;
ppdata = ppdata;
while(1)
{
number++;
if(number>9) number=0;
kk=(stryy xdata*)OSMemGet(mem,&err);
//kk=yyy;
kk->a=5 ;
err=OSQPost(CommQ,(void *)kk);
switch(err)
{
case OS_NO_ERR:
printf("post msg ok!\n");
break;
case OS_Q_FULL:
OSQFlush(CommQ);
printf("box is over!");
break;
}
// printf("\n1");
OSTimeDlyHMSM(0,0,10,0);
}
}
void Task2(void xdata * ppdata) reentrant
{
unsigned char err;
unsigned char xdata *pp;
ppdata = ppdata;
while(1)
{
pp=(unsigned char xdata*)OSQPend(CommQ,0,&err);
if(err==OS_NO_ERR)
{
switch(*pp)
{
case 1:
printf("received value is 1\n");
break;
case 2:
printf("received value is 2\n");
break;
case 3:
printf("received value is 3\n");
break;
case 4:
printf("received value is 4\n");
break;
case 5:
printf("received value is 5\n");
break;
case 6:
printf("received value is 6\n");
break;
case 7:
printf("received value is 7\n");
break;
case 8:
printf("received value is 8\n");
break;
case 9:
printf("received value is 9\n");
break;
case 0:
printf("received value is 0\n");
break;
default:
printf("received default");
break;
}
}
else
{
printf("err explain");
}
}
err=OSMemPut(mem,pp);
}
void SerialInitial()
{
/* set TI to 1, set TR1 to 1 */
SCON = 0x52;/* SM0 SM1 =1 SM2 REN TB8 RB8 TI RI */
TMOD = 0x20;/* GATE=0 C/T-=0 M1 M0=2 GATE C/T- M1 M0 */
TH1 = 0xE6; /* TH1=E6 4800bit/s when at 24MHz,TH1=F3,9600bit/s,24MHz */
PCON = 0x80;
TCON = 0x40;/* 01101001 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT */
}
void InterruptInitial()
{
/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */
TMOD |= 0x01;
TH0 = 0x70;
TL0 = 0x00;
/* TR0 is set in OSStart() */
ET0 = 1;
}
main()
{
unsigned char errm;
SerialInitial();
InterruptInitial();
OSInit();
printf("\nstart");
//pReceiverMailBox=OSMboxCreate((void*)0);
//pSenderMailBox=OSMboxCreate((void*)0);
mem=OSMemCreate(&Memo,5,32,&errm);
CommQ=OSQCreate((void xdata*)&CommMsg[0],3);
OSQFlush(CommQ);
OSTaskCreate(Task1, (void xdata *)0, &Task1Stack[0],2);
OSTaskCreate(Task2, (void xdata *)0, &Task2Stack[0],3);
OSStart();
}
答 1: 在问是否ucos在8位机上移植有限制?
在http://www.zlgmcu.com网站的专栏上下载了一份uc/os在Keil上的移植程序,作了一些应用的改动,主要是想验证一下使用uc/os的内存管理,在这里我使用任务1分配一块内存,然后发送相应的消息,在任务2中接收相应的消息,释放分配的内存,发现发配的内存指针在传递的过程中被更改,不知到是为什么?能帮助解释一下吗?谢谢!
void Task1(void xdata * ppdata) reentrant
{
unsigned char err;
stryy xdata* kk;
ppdata = ppdata;
while(1)
{
number++;
if(number>9) number=0;
kk=(stryy xdata*)OSMemGet(mem,&err);
//kk=yyy;
kk->a=5 ;
err=OSQPost(CommQ,(void *)kk);
switch(err)
{
case OS_NO_ERR:
printf("post msg ok!\n");
break;
case OS_Q_FULL:
OSQFlush(CommQ);
printf("box is over!");
break;
}
// printf("\n1");
OSTimeDlyHMSM(0,0,10,0);
}
}
void Task2(void xdata * ppdata) reentrant
{
unsigned char err;
unsigned char xdata *pp;
ppdata = ppdata;
while(1)
{
pp=(unsigned char xdata*)OSQPend(CommQ,0,&err);
if(err==OS_NO_ERR)
{
switch(*pp)
{
case 1:
printf("received value is 1\n");
break;
case 2:
printf("received value is 2\n");
break;
case 3:
printf("received value is 3\n");
break;
case 4:
printf("received value is 4\n");
break;
case 5:
printf("received value is 5\n");
break;
case 6:
printf("received value is 6\n");
break;
case 7:
printf("received value is 7\n");
break;
case 8:
printf("received value is 8\n");
break;
case 9:
printf("received value is 9\n");
break;
case 0:
printf("received value is 0\n");
break;
default:
printf("received default");
break;
}
}
else
{
printf("err explain");
}
}
err=OSMemPut(mem,pp);
}
void SerialInitial()
{
/* set TI to 1, set TR1 to 1 */
SCON = 0x52;/* SM0 SM1 =1 SM2 REN TB8 RB8 TI RI */
TMOD = 0x20;/* GATE=0 C/T-=0 M1 M0=2 GATE C/T- M1 M0 */
TH1 = 0xE6; /* TH1=E6 4800bit/s when at 24MHz,TH1=F3,9600bit/s,24MHz */
PCON = 0x80;
TCON = 0x40;/* 01101001 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT */
}
void InterruptInitial()
{
/* set timer. 50ms, THTL = 3caf when cpu at 12MHz */
TMOD |= 0x01;
TH0 = 0x70;
TL0 = 0x00;
/* TR0 is set in OSStart() */
ET0 = 1;
}
main()
{
unsigned char errm;
SerialInitial();
InterruptInitial();
OSInit();
printf("\nstart");
//pReceiverMailBox=OSMboxCreate((void*)0);
//pSenderMailBox=OSMboxCreate((void*)0);
mem=OSMemCreate(&Memo,5,32,&errm);
CommQ=OSQCreate((void xdata*)&CommMsg[0],3);
OSQFlush(CommQ);
OSTaskCreate(Task1, (void xdata *)0, &Task1Stack[0],2);
OSTaskCreate(Task2, (void xdata *)0, &Task2Stack[0],3);
OSStart();
}
答 1: 在问是否ucos在8位机上移植有限制?
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |