打印
[ZLG-ARM]

UC/OS II问题

[复制链接]
2137|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zliang2004|  楼主 | 2007-1-30 16:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uC/os, ST, TI, TE, se
刚学UC/OS,有不懂的地方请教各位:
看书中写在OSStart()后要安装并启动UC/OS的时钟节拍,但我看书中实例怎么样没写??(红色部分没出现)
void  main (void)
{
    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */

    OSInit();                                              /* Initialize uC/OS-II                      */

    PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */
    PC_VectSet(uCOS, OSCtxSw);                             /* Install uC/OS-II's context switch vector */

    RandomSem   = OSSemCreate(1);                          /* Random number semaphore                  */

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();                                             /* Start multitasking                       */
}
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
    char       s[100];
    INT16S     key;


    pdata = pdata;                                         /* Prevent compiler warning                 */

    TaskStartDispInit();                                   /* Initialize the display                   */

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                           /* Install uC/OS-II's clock tick ISR        */
    PC_SetTickRate(OS_TICKS_PER_SEC);                      /* Reprogram tick rate                      */
    OS_EXIT_CRITICAL();

    OSStatInit();      
                                    /* Initialize uC/OS-II's statistics         */

    TaskStartCreateTasks();                                /* Create all the application tasks         */

    for (;;) {
        TaskStartDisp();                                  /* Update the display                       */


        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                            */
            }
        }

        OSCtxSwCtr = 0;                                    /* Clear context switch counter             */
        OSTimeDlyHMSM(0, 0, 1, 0);                         /* Wait one second                          */
    }
}

相关帖子

沙发
zlgARM| | 2007-1-30 16:31 | 只看该作者

RE

您好。
您所提到的红字部分是针对PC的函数,而我们的范例是在移植到Lpc2000系列上的ucos上运行的。根本是两个不同的移植对象,所以对应的程序自然不同。

使用特权

评论回复
板凳
zliang2004|  楼主 | 2007-1-30 16:38 | 只看该作者

回复

我现在看的就是北航的UC/OSII这本书,提的问题也这本书中看的。这个代码是这本书中的一个实例。
这本书中写在OSStart()启动后要安装并启动UC/OS的时钟节拍;但OSStart()启动后运行的第一个任务是TaskStart();而这个任务中初始化部分就没有什么启动时钟节拍的?

使用特权

评论回复
地板
zliang2004|  楼主 | 2007-1-31 18:09 | 只看该作者

回复

怎么没人,请教高手怎么开启时钟节拍的?

使用特权

评论回复
5
zlgARM| | 2007-2-1 09:01 | 只看该作者

RE

uc/OS要求用户提供一个周期性的时钟源,来实现延时和超时等功能。

那么,该时钟源是在哪里初始化的呢?

uc/OS的规定是,调用OSStart()后,初始化该时钟源,但是OSStart()函数根本不会返回,它直接启动了第一个任务。

所以,根据规定,只能在OSStart启动的第一个任务里完成时钟源的初始化。

在我们公司的uc/os移植版本里,是使用硬件定时器作为时钟源,并且在第一个任务里的TargetInit实现。

而在书本上你所提到的例子里,肯定也是在第一个任务TaskStart里完成了初始化,但查阅uc/os手册可知, PC_VectSet和 PC_SetTickRate都不是用来初始化时钟源的。而该任务里的其它函数,更加不可能是。
那么只有一个可能,那就是在BIOS或者DOS里,PC就已经初始化了某个时钟源了,(BIOS完成了目标板的初始化)于是我们只需要把该时钟源的中断入口和我们的ISR地址联系在一起。

但具体如何在BIOS里初始化时钟源的,抱歉我也不知道。如果楼主仍然有兴趣钻研,可以考虑去寻找BIOS和DOS的源码来看看。如果找到了,欢迎你来这里分享你的心得。



使用特权

评论回复
6
zliang2004|  楼主 | 2007-2-1 12:38 | 只看该作者

回复

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

30

帖子

0

粉丝