knight_lxf 发表于 2013-9-2 20:40:27

uC/OS 利用重构的printf函数 但是多任务启动后 跑飞问题 求...

代码如下:int main(void)
{
        OSInit();
        Stm32f10xBSP();
        UsartOut("/--------uC/OS-II 消息队列演示例程--------/\n");    //就是这句代码的开启与关闭会影响 OSStart()之后是否进入TaskStart()
        //UsartOut("变参函数演示 %d\n",d);                                             //忽略此句
        //UsartOut("变参函数演示 %s","this is the string demo\n");                //忽略此句
        //UsartOut("变参函数演示 %s这是第%d次\n","OK",d);                     //忽略此句
        OSTaskCreate(
                        TaskStart,
                        (void *)0,
                        &TaskStartSTK,
                        TASK_START_PRIO
                        );
        OSStart();
       
        return 0x0;
}

static void TaskStart(void *pdata)
{
        pdata = pdata;

        COMQ = OSQCreate(StrTbl,5);

        OSTaskCreate(
                        Task1,
                        (void *)0,
                        &Task1STK,
                        TASK_1_PRIO
                        );
        OSTaskCreate(
                        Task2,
                        (void *)0,
                        &Task2STK,
                        TASK_2_PRIO
                        );
        OSTaskCreate(
                        TaskUsartPrintf,
                        (void *)0,
                        &TaskUsartPrintfSTK,
                        TASK_USART_PRINTF_PRIO
                        );

        while(1)
        {
                GPIOBSetGpx(GPIO_PIN_0);
                OSTimeDlyHMSM(0,0,0,50);
                GPIOBResetGpx(GPIO_PIN_0);
                OSTimeDlyHMSM(0,0,0,50);
        }
}现象描述:
如果关闭那句话 则OSStart启动之后,会进入TaskStart任务继续执行;如果打开那句话,则OSStart之后,不会进入TaskStart任务中。
难道是因为资源被占用????不应该啊!
求大神指导!

Eric2013 发表于 2013-9-2 20:48:37

注意规范的uCOS-II的初始化
OSInit();
初始化启动任务
OSStart();

在启动任务里面初始化外设,以及滴答时钟,详细的楼主课参考官网的例子

knight_lxf 发表于 2013-9-2 20:51:45

Eric2013 发表于 2013-9-2 20:48 static/image/common/back.gif
注意规范的uCOS-II的初始化
OSInit();
初始化启动任务


哦 呵呵 多谢多谢!这个真没怎么看过就想着先会用再说! 刚学 新手 见谅!   像我这样的代码   也不至于该影响程序的正常执行吧? 是因为不规范 才导致我说的那个问题嘛??

Eric2013 发表于 2013-9-2 20:53:15

knight_lxf 发表于 2013-9-2 20:51 static/image/common/back.gif
哦 呵呵 多谢多谢!这个真没怎么看过就想着先会用再说! 刚学 新手 见谅!   像我这样的代码   也不至 ...

是因为不规范造成,有机会了读读源码就可以知道为什么要这么写。

knight_lxf 发表于 2013-9-2 21:18:25

Eric2013 发表于 2013-9-2 20:53 static/image/common/back.gif
是因为不规范造成,有机会了读读源码就可以知道为什么要这么写。

{:handshake:}   果然   谢了!

nongxiaoming 发表于 2013-9-2 21:21:27

用个互斥量去锁住啊,使用完才会释放,释放了才会到其他线程使用,否则就等在那里

eye 发表于 2013-9-3 09:49:20

OSStart()准备好前不能发生Tick中断就行了。

knight_lxf 发表于 2013-9-3 20:36:24

eye 发表于 2013-9-3 09:49 static/image/common/back.gif
OSStart()准备好前不能发生Tick中断就行了。

哦原来如此 。因为USART打印字符的时间相对较长,所以发生了SysTick中断,进ISR调用uC/OS提供的服务,但此时uC/OS内核尚未启动。因此跑飞!谢谢!

eye 发表于 2013-9-3 21:29:28

knight_lxf 发表于 2013-9-3 20:36 static/image/common/back.gif
哦原来如此 。因为USART打印字符的时间相对较长,所以发生了SysTick中断,进ISR调用uC/OS提供的服务, ...

启动任务并不是必须的。
虽然uCOS明确要求Tick启动要在Start之后。。。

knight_lxf 发表于 2013-9-4 19:31:27

eye 发表于 2013-9-3 21:29 static/image/common/back.gif
启动任务并不是必须的。
虽然uCOS明确要求Tick启动要在Start之后。。。

兄台,请教另一个比较丢人的问题。 看了段uC/OS了 ,现在的感觉:有时感觉貌似会了(信号量、互斥、邮箱、队列这些东西的接口函数会操作了),有时再细想貌似又什么都不懂! 不知能否理解我说的,如果理解,如果你也有过相同的经历。望指点一二!!真心求教!!先行谢过!

eye 发表于 2013-9-4 20:01:39

Debug单步跟进去,查看关键的数据结构变量。

knight_lxf 发表于 2013-9-4 20:28:30

eye 发表于 2013-9-4 20:01 static/image/common/back.gif
Debug单步跟进去,查看关键的数据结构变量。

谢谢试试!
页: [1]
查看完整版本: uC/OS 利用重构的printf函数 但是多任务启动后 跑飞问题 求...