ucosii-285在winavr20070525中移植问题求助!
目标CPU:m128问题概述:
(1)若在main函数中建立所有的任务,如下:
int main(void)
{
TargetInit();
OSInit();
OSTaskCreateExt(TaskStart,
(void *)0,
&TaskStartStk,
TaskStartPrio,
TaskStartPrio,
&TaskStartStk,
OS_TASK_START_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
OSTaskCreateExt(TaskTest0,
(void *)0,
&TaskTestStk0,
TaskTest0Prio,
TaskTest0Prio,
&TaskTestStk0,
OS_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
OSStart();
return 0;
}
一切正常,下载到目标板也能正常工作。
(2) 若采用如下方式,将TaskTest0任务的建立放到TaskStart任务中
void TaskStart(void *pdata)
{
pdata = pdata;
init_timer0();/*初始化时钟节拍中断*/
OSTaskCreateExt(TaskTest0,
(void *)0,
&TaskTestStk0,
TaskTest0Prio,
TaskTest0Prio,
&TaskTestStk0,
OS_TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_CLR );
while(1)
{
GREEN_LED_CHG
OSTimeDlyHMSM(0,0,2,0);
}
}
编译链接没有问题,但是下载到m128中不能正常工作,下面对该程序进行了分析,发现在建立TaskTest时Ram乱了,具体分析见下文:
(1)Mega64(同128)的SRAM结构为:内部的32个寄存器和224个IO寄存器,内部RAM地址从0x100开始,一直到0x10FF;
(2)工程编译通过,占用的flash 、ram空间如下:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201612.jpg
(3) 该工程共3个任务,TaskStart堆栈为300,TaskTest为100,IdleTask为64;
编译后改任务占ram空间为1890个字节,从0x100--0x861;
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201614.jpg
OSMapTbl 0x08 0x100-0x107
OSUnMapTbl 0x100 0x108-0x207
TaskStartStk 0x12c 0x208-0x333
TaskTestStk0 0x64 0x334-0x397
OSLockNesting 0x1 0x398
OSRunning 0x1 0x399
OSIdleCtr 0x4 0x39A-0x39D
OSPrioHighRdy 0x1 0x39E
OSPrioCur 0x1 0x39F
OSTCBList 0x2 0x3A0-0x3A1
OSCtxSwCtr 0x4 0x3A2-0x3A5
OSTCBFreeList 0x2 0x3A6-0x3A7
OSTaskCtr 0x1 0x3A8
OSTCBHighRdy 0x2 0x3A9-0x3AA
OSRdyGrp 0x1 0x3AB
OSRdyTbl 0x8 0x3AC-0x3B3
OSEventFreeList 0x2 0x3B4-0x3B5
OSIntNesting 0x1 0x3B6
OSTCBCur 0x2 0x3B7-0x3B8
OSTime 0x4 0x3B9-0x3BC
OSTaskIdleStk 0x40 0x3BD-0x3FC
OSEventTbl 0xdc 0x3FD-0x4D8
OSTCBTbl 0x309 0x4D9-0x7E1
OSTCBPrioTbl 0x80 0x7E2-0x8b1
(4) 错误出现在TaskTest任务的建立函数中,在执行voidOS_TaskStkClr (OS_STK *pbos, INT32U size, INT16U opt) 时,size大小在执行size--操作时,莫名其妙的改变了! pbos地址为0x2F4,size地址为0x2F6.
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_201615.jpg
工程文件:(avrstudio4.12+winavr20070525)
点击此处下载ourdev_201616.rar(文件大小:234K)
上边说明文档的doc格式:
点击此处打开ourdev_201617.doc(文件大小:116K) :( 没人帮忙啊~ 是我描述得不清楚吗? 问题找到了:
首先,栈分为硬件栈和软件栈.R0至R31还有SP等M128的寄存器全都分配到硬件栈,在任务间切换时,按OSTaskStkInit函数安排的顺序入栈;软件栈存放来自PUSH命令的数据.
先看二幅截图:
第一幅是TaskStart函数在初始化栈后的截图:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202112.JPG
我编译后分配的硬件栈地址为:0x311-0x333.
第二幅是准备运行TaskStart时的汇编截图:
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_202113.JPG
请注意SP的值 :)
可以看到SP在进入任务时,没有把它指向软件栈,也即0x310.
呵呵,硬件栈不保啊!!!!!!! 多谢!
感觉分析的不是很对呢? 之所以在TaskStart开始时SP恢复到0x333,是因为以前入栈的寄存器已经完全出栈吧? 我晕了~~~唉。。。。
下边上传一个iar下的移植程序,比较完整,经过测试没有什么问题,而且有详细注释。
点击此处下载ourdev_202357.rar(文件大小:1.82M) 顶起来~~
页:
[1]