打印
[STM32F3]

ucosiii延时求解

[复制链接]
5120|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近入门ucosiii。自己移植的这个同时开2个进程好像延时不了,流水灯不行,一直是亮,在延时卡死,但是如果去掉task2进程就可以的,求解
static void task1(void *p_arg);
static void task2(void *p_arg);
static void startup_task(void *p_arg);

static CPU_STK startup_task_stk[APP_TASK_START_STK_SIZE];
static CPU_STK task1_stk[TASK1_STK_SIZE];
static CPU_STK task2_stk[TASK2_STK_SIZE];


static  OS_TCB   AppTaskStartTCB;
static  OS_TCB   Task1_TCB;
static  OS_TCB   Task2_TCB;
static volatile OS_SEM taskSem;

#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004
#define  DEM_CR_TRCENA                   (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)
/*CPU_INT32U  BSP_CPU_ClkFreq (void)
{
    RCC_ClocksTypeDef  rcc_clocks;


    RCC_GetClocksFreq(&rcc_clocks);

    return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}  */
          

static void systick_init(void)
{
        RCC_ClocksTypeDef rcc_clocks;
        RCC_GetClocksFreq(&rcc_clocks);
        SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
        LED0 = 0;
        LED1 = 0;
        LED2 = 0;
        LED3 = 0;

}                 

#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{
     
}
#endif
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{
    return (SysTick->VAL);
}
#endif


static void task1(void *p_arg)
{
    OS_ERR  err;
        while(1)
        {
                LED0 = 1;
                LED1 = 1;
                LED2 = 1;
                LED3 = 1;
            OSTimeDly(100,OS_OPT_TIME_DLY, &err) ;                           
                LED0 = 0;
                LED1 = 0;
                LED2 = 0;
                LED3 = 0;
        OSTimeDly(100,OS_OPT_TIME_DLY, &err) ;
                        
        }
}



static void task2(void *p_arg)
{            OS_ERR  err;
        for (;;)
        {
                 if(KEY0 == 0)
                {
                        LED0 = 1;
                }
                if(KEY1 == 0)
                {
                        LED0 = 0;
                }
                if(KEY2 ==0)
                {
                    LED2 = 1;
                }
                  
            
       
        }
}
   

static void startup_task(void *p_arg)
{
    OS_ERR  err;
         CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;
   
          
         
        // while(SysTick_Config(SystemFrequency / OS_TICKS_PER_SEC));           /* Initialize the SysTick. */
         key_init();
           led_init();


       
                   
                 
         OSTaskCreate((OS_TCB     *)&Task1_TCB,                                          
                 (CPU_CHAR   *)"task1",
                 (OS_TASK_PTR ) task1,
                 (void       *) 0,
                 (OS_PRIO     ) TASK1_PRIO,
                 (CPU_STK    *)&task1_stk[0],
                 (CPU_STK_SIZE) TASK1_STK_SIZE / 10,
                 (CPU_STK_SIZE) TASK1_STK_SIZE,
                 (OS_MSG_QTY  ) 0,
                 (OS_TICK     ) 0u,
                 (void       *) 0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);  

         OSTaskCreate((OS_TCB     *)&Task2_TCB,                                          
                 (CPU_CHAR   *)"task2",
                 (OS_TASK_PTR ) task2,
                 (void       *) 0,
                 (OS_PRIO     ) TASK2_PRIO,
                 (CPU_STK    *)&task2_stk[0],
                 (CPU_STK_SIZE) TASK2_STK_SIZE / 10,
                 (CPU_STK_SIZE) TASK2_STK_SIZE,
                 (OS_MSG_QTY  ) 0,
                 (OS_TICK     ) 0,
                 (void       *) 0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);
                                                                          

                OSSemCreate(    (OS_SEM     *)&taskSem,
                    (CPU_CHAR   *)"taskSem",
                    (OS_SEM_CTR )0,
                    (OS_ERR     *)err);
   
    OSTaskDel(      (OS_TCB     *)&AppTaskStartTCB,
                    (OS_ERR     *)&err);
  //        OSTaskDel(OS_PRIO_SELF);
}



int main(void)
{
          OS_ERR  err;
         SystemInit();
          systick_init();  
          CPU_Init();
    OSInit(&err);
   
    OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                /* Create the start task                                */
                 (CPU_CHAR   *)"startup tast",
                 (OS_TASK_PTR ) startup_task,
                 (void       *) 0,
                 (OS_PRIO     ) APP_TASK_START_PRIO,
                 (CPU_STK    *)&startup_task_stk[0],
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,
                 (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
                 (OS_MSG_QTY  ) 5u,
                 (OS_TICK     ) 0u,
                 (void       *) 0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR     *)&err);

    OSStart(&err);
        return 0;
}
沙发
LSQHHH| | 2014-1-3 16:17 | 只看该作者
task2中加上 OSTimeDly(100,OS_OPT_TIME_DLY, &err) ; 就可以了

使用特权

评论回复
板凳
杨爱林林| | 2014-1-3 16:20 | 只看该作者
你是特意把task2里面的delay去掉的吧
ucos在 OSTimeDly里面会进行任务调度的,你这样去掉延时就等于一直执行task2了
如图

ucos.jpg (63.85 KB )

ucos.jpg

使用特权

评论回复
地板
杨爱林林| | 2014-1-3 16:34 | 只看该作者
补充下,刚才回答欠妥!
你执行task2后,如果没有delay,就不会进行任务调度
如果你开启SysTick_Handler
就会一直往复进入这个中断

使用特权

评论回复
5
happyming0809|  楼主 | 2014-1-3 16:40 | 只看该作者
杨爱林林 发表于 2014-1-3 16:34
补充下,刚才回答欠妥!
你执行task2后,如果没有delay,就不会进行任务调度
如果你开启SysTick_Handler

你回复得很明白,可以了,看来我还需要多看书。谢谢!

使用特权

评论回复
6
happyming0809|  楼主 | 2014-1-3 16:41 | 只看该作者
LSQHHH 发表于 2014-1-3 16:17
task2中加上 OSTimeDly(100,OS_OPT_TIME_DLY, &err) ; 就可以了

没故意,是不想用。对系统概念还不太熟悉,以后多多向你学习:)

使用特权

评论回复
7
杨爱林林| | 2014-1-3 16:46 | 只看该作者
happyming0809 发表于 2014-1-3 16:41
没故意,是不想用。对系统概念还不太熟悉,以后多多向你学习

共同学习,任务延时后,会将自己挂起
OSTCBCur->OSTCBDly = ticks;              /* Load ticks in TCB

然后在SysTick_Handler里面
调用OSTimeTick函数
OSTimeTick里面将OSTCBDly递减
当OSTCBDly为零,条件满足的时候,就可以继续执行了

使用特权

评论回复
8
jd吕凯| | 2014-1-4 08:49 | 只看该作者
看你的命名,估计task1优先级比2高,这样的话task1延时时间到了也是会被调度运行的,这叫高优先级抢占低优先级,只是一进去就有延时,就又被挂起了,所以你“几乎”看不到1运行。

使用特权

评论回复
9
hdp7891000| | 2014-1-4 12:30 | 只看该作者
我觉的把TASK1的优先级设置比TASK2高应该可以

使用特权

评论回复
10
m__dd| | 2014-1-4 16:50 | 只看该作者
hdp7891000 发表于 2014-1-4 12:30
我觉的把TASK1的优先级设置比TASK2高应该可以

还要开系统定时器

使用特权

评论回复
11
happyming0809|  楼主 | 2014-1-6 18:21 | 只看该作者
hdp7891000 发表于 2014-1-4 12:30
我觉的把TASK1的优先级设置比TASK2高应该可以

我试过不行呢,还是要在task2加OSTimeDly才行,真有意思

使用特权

评论回复
12
hdp7891000| | 2014-1-7 18:24 | 只看该作者
m__dd 发表于 2014-1-4 16:50
还要开系统定时器

额,系统调度的定时器不是默认开启的么?

使用特权

评论回复
13
hdp7891000| | 2014-1-7 18:25 | 只看该作者
happyming0809 发表于 2014-1-6 18:21
我试过不行呢,还是要在task2加OSTimeDly才行,真有意思

抢占优先级的定义就是高优先级可以打断低优先级程序的运行啊。
奇怪。

使用特权

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

本版积分规则

25

主题

237

帖子

1

粉丝