OSTaskCreate()
函数原型QINT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
调用者:d或者是初始化代码?br style="line-height: 22px" />作用Q徏立一个新dQQ务的建立可以在多个Q务环境启动之前,也可以在正在q行的Q务中建立Q中断处理程序中不能建立dQ一个Q务必Mؓ无限循环l构Q且不能有返回点。无论用L序中是否产生中断Q在初始化Q务堆栈时Q堆栈的l构必须与处理器中断后寄存器入栈的顺序结构相同?/span>
该函数返回一?位的整Ş敎ͼ调用该函数需要四个参敎ͼ
a W一个参敎ͼtask是一个指向Q务代码的指针Q也是用户代码的首地址Q^怋用中我们把自己创建的d的名字作个参数即可?br style="line-height: 22px" />b W二个参敎ͼpdata指向一个数据结构,该结构用来在建立d时向d传递参数?br style="line-height: 22px" />c W三个参敎ͼptos是指向Q务堆栈栈的指针Q一般把创徏的Q务的堆栈数组首地址赋给它?br style="line-height: 22px" />d堆栈用来保存局部变量,函数参数Q返回地址以及d被中断时处理器寄存器的内容,d堆栈的大决定于d的需要以及预计的中断嵌套层数。计堆栈的大小需要知道Q务的局部变量所占的I间Q可能生嵌套调用的函数Q及中断嵌套所需的空_如果初始化常量OS_STK_GROWTH设ؓ1Q堆栈被设ؓ从内存高地址向低地址增长Q此时ptos应该指向d堆栈I间的最高地址Q反之,如果OS_STK_GROWTH设ؓ0Q堆栈将从内存的低地址向高地址增长?br style="line-height: 22px" />d W四个参敎ͼprio是Q务的优先U。每个Q务必L一个唯一的优先作ؓ标识Q数字越,优先U越高?/p>
q回|
OSTaskCreate()的返回gؓ下述之一Q?br style="line-height: 22px" /># OS_NO_ERR: 函数调用成功?br style="line-height: 22px" /># OS_PRIO_EXIST:h该优先的Q务已l存在?br style="line-height: 22px" /># OS_PRIO_INVALID: 参数指定的优先大于OS_LOWEST_PRIO
# OS_NO_MORE_TCB: pȝ中没有OS_TCB可以分配lQ务了?/p>
注意Q?br style="line-height: 22px" />1 M堆栈必须声明为OS_STKcd?br style="line-height: 22px" />2 在Q务中必须调用uCOS提供的下q过E之一Qg时等待,d挂vQ等待事件发生({待信号量,消息邮箱Q消息队列)Q以便其他Q务能得到cpu?br style="line-height: 22px" />3 E序中不能用优先0Q?Q?Q?Q以及OS_LOWEST_PRIO-3QOS_LOWEST_PRIO-2QOS_LOWEST_PRIO-1Q?/p>
OS_LOWEST_PRIO,q些优先U系l保留,其余?6个优先提供l应用程序?/p>
范例Q?br style="line-height: 22px" />本例中,传递给dTask1()的参数pdata不用,所以指针pdata被设为NULLLQ注意到E序中设定堆栈向低地址增长Q传递的栈顶指针为高地址&Task1[1023],如果在你的程序中讑֮堆栈向高地址增长Q则传递的栈顶指针应该?amp;Task1Stk[0]?br style="line-height: 22px" />OS_STK Task1Stk[1024];
void main(void)
{
NT8U err;
...
OSInit();//初始化uCOS-II
....
OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);
...
OSStart();//启动多Q务环?br style="line-height: 22px" />}
void Task1(void *pdata)
{
pdata=pdata;
for(;;)
{
...... //d代码
}
}
与Nand Flash对应的是另一UFlashQNor FlashQ其对应的特ҎQ?br />“NorFlash的特Ҏ芯片内执?XIP,eXecute In Place)Q这样应用程序可以直接在flash闪存内运行,不必再把代码dpȝRAM中。如uboot中的roD可以直接在NorFlash上运行,只需要把rw和ziD|贝到RAM中运行即可?”
而相应地QNand Flash比较ҎQ?br />“NandFlash器g使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成NAND控制器。另外由于NandFlash没有挂接在地址ȝ上,所以如果想用NandFlash作ؓpȝ的启动盘Q就需要CPU具备Ҏ的功能,如s3c2410在被选择为NandFlash启动方式时会在上甉|自动dNandFlash?k数据到地址0的SRAM中。如果CPU不具备这U特D功能,用户不能直接q行NandFlash上的代码Q那可以采取其他方式Q比如好多用NandFlash的开发板除了使用NandFlash以外Q还用上了一块小的NorFlash来运行启动代码?#8221;
至于Qؓ什么Nand Flash不能q行XIP的原因,主要是由于物理上的硬仉Ӟ
在读取Flash时候,Ҏ出现“位翻转(bit convertQ?#8221;Q?br />“在Flash的位{Q一个bit位发生翻转)现象上,NAND的出现几率要比NorFlash大得多。这个问题在Flash存储关键文g时是致命的,所以在使用NandFlash时徏议同时用EDC/ECC{校验算法?”
但是Q如果能保证不出错,也还是可以进行XIPQ可以在其上执行代码的:
“所谓XIP,是CODE是在FLASH上直接运? NANDFLASH只是不适合做XIP,但ƈ不是不能做XIP.
要一DCODE能够正确的运?要保证它的CODE是连l的,正确?
׃一些电气特性的原因,NOR FLASH能够做到q一?不存在坏道或坏块,所以能够做XIP.
而对于NAND FLASH, 它只保证它的BLOCK 0是好?其他的块q不保证,虽然出错的几率比较低,但还是有出错的可?所以CODE可能无法q箋正确地执?
但只要你有额外的保障措施,比如说在执行CODE之前d一ơECC校验,来确保CODE是连l正的.那你也可以做XIP. 事实上我正在这么做,而且也证明是成功? ”