这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » uc/os 问题

共6条 1/1 1 跳转至

uc/os 问题

菜鸟
2007-01-30 01:04:30     打赏

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

问:怎么确认临界代码段,main中红色部分的不是,而在taskstar中的是,加关闭中断处理???




关键词: 问题    

菜鸟
2007-01-30 09:34:00     打赏
2楼

你分析一下OS_ENTER_CRITICAL();做了什么,有可能是设置一个标志位。这样,在切换的时候先检查这个标志位,如果置位了,就不切换。

只是一种可能,仅供参考。


菜鸟
2007-01-31 00:10:00     打赏
3楼
OS_ENTER_CRITICAL()在UC/OS-II书中介绍的是关闭中断;是保护临界代码段的一种方法。不知道这上面两个地方为什么有区别??

菜鸟
2007-02-01 02:20:00     打赏
4楼
怎么没人知道?

菜鸟
2007-03-10 06:09:00     打赏
5楼
是不是因为前一个地方,系统刚初始化,还没有任务运行,所以不用保护

菜鸟
2007-03-12 23:42:00     打赏
6楼

5楼有理


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]