大宇的ucos移植c51心得
来源:互联网 发布:手机国际象棋软件 编辑:程序博客网 时间:2024/05/02 04:42
这是我的移植心得:
单片机使用R7传参数,在调用任务函数时,提前把R7里放上该传的参数值,等到调用任务函数时,编译器自动到R7里把参数取出放到任务函数的形参里。
本人在做传参时,在main()里声明int8u idata dat = 0x05;注意是idata。在Create()任务时传过去的参数是地址&dat,然后初始堆栈时也应该是地址,在然后是OSStart()调用Taskrdy(),他是个汇编程序,在里面POP R7
这时R7里是地址;完了是开始任务函数了把R7赋给pd(形参),pd是地址
在函数里面处理*pd = dat了,就行了。
但犯了点毛病:
犯错:第一,osinitstack时初始化堆栈对应R7的堆栈里放了*(INT8U *)ppdata,这是dat这个数不是地址,然后R7赋给pd,pd = dat,*pd = ???。
第二,R7传参数时只能传8位的,我在Task()任务函数的形参处这样声明的Task(void *pd)
编译器默认的是大模式,在Xdata里给pd开辟内存单元,这时一个8位的给一个多位的赋值当然不对了哈,必须声明成idata即(void idta *pd)
在任务函数里也能传数组,即把数组的地址放到R7里面
/*
void Task1(INT8U idata *pd)
{
for(;;)
{
P1 = *pd;
OSTimeDly(10);
}
}
void main()
{
INT8U idata dat = 0x05;
OSInit();
OSTaskCreate(Task1,(void *)&dat,TaskStk,1);
OSStart();
}
传数组的:
void Task1(void idata *pd)
{
for(;;)
{
P1 = *(INT8U *)(pd + 1);
OSTimeDly(10);
}
}
void main()
{
INT8U idata dat[3] = {0x05,0x06,0x07};
OSInit();
OSTaskCreate(Task1,(void *)&dat,TaskStk,1);
OSStart();
}
*/
在这里只能是idata 因为早晚这个地址得给R7,而R7是个八位的,如果是Xdata 的话,这个地址是大于8位的肯定装不下了,就错了 哈;这里如果系统中不传地址而直接传值的话,那样倒可以在内存的任何地方申请单元放变量,因为这个数肯定是unsigned char的,但这样又不能传数组了,因为不传地址的缘故。
关于重入问题:keil把重入函数的临时变量放在?C_XBP这个寄存器所指向的内存单元中,即?C_XBP里放的内容如:X:0x02F1,则临时变量压在从X:0x02F1单元开始往下的单元:如:
第一个要保存的重入参数是uchar c ,第二个参数是uchar b,则在X:0x02F0单元里放c,在X:0x02EF单元里放b。这个指针指的单元不用而用下个单元。
?C_XBP寄存器的地址是0x08,初始化时?C_XBP里放的是0x02F1这个数, X:0x02F1里放临时变量。
- 大宇的ucos移植c51心得
- uCOS-Ⅱ C51移植笔记
- ucos在lpc上的移植心得
- 移植uCOS到STR9的一些心得
- uCOS-II移植的一点心得
- uCOS-II2.86 移植的一点心得
- 移植uCOS-II到C51 - 1
- 移植uCOS-II到C51 - 2
- 移植uCOS-II到C51 - 3
- 移植uCOS-II到C51 - 4
- 移植uCOS-II到C51 - 5
- 移植uCOS-II到C51 - 6
- 移植uCOS-II到C51 - 7
- lpc2200移植ucos-II心得
- uCOS在51单片机上的移植心得
- ucos的移植
- STM32的ucos移植
- ucos的移植 随笔
- SQL优化34条
- c#输入框只能输入数字方法
- ASP.NET学习笔记--文件上传
- 从追MM谈Java的23种设计模式
- ARM amba总线介绍
- 大宇的ucos移植c51心得
- MY 总结:理解js中的:Null、undefined、""、0、false
- 怎么样才能嫁给有钱人?经典问答
- 8/22工作计划
- SQL优化34条[SQL收藏]
- 饮食法则 6周拥有平坦小腹
- 最具原创性、想像力的十部电影
- Oracle常用的一些时间处理函数
- 男人必看的十部影片