-
你们老师太牛叉了 感觉都可以拿去做笔试题了 一点都不应试教育啊
-
顶个贴 看代码 谢谢分享
-
学习,谢谢分享
-
看看答案
-
感谢分享
-
好奇:pleased:
-
单节锂电池充电IC可以用TP4056。5V升压IC就自己找吧,也不知道你要求多大的功率额……
-
回复查看……
-
TASK_LED第一次释放信号量后由于等待延时的原因产生任务切换,系统运行TASK1。TASK1执行至第二次等待信号之时进入等待状态,产生任务切换。注意:由于此时TASK_LED尚在等待延时结束而且你并没有其他任务,因此系统进入统计任务或空闲任务,直至2S的延时结束系统自动切换到TASK_LED。TASK_LED第二次释放信号量,随后等待2S延时结束。任务切换,系统运行TASK1,关闭LED。。。。。
-
OSTaskSuspend(B),这句话的意思是将B任务挂起。但是,这个函数时如何完成对于任务的挂起的呢?说白了,就是两步。第一步:将这个任务置为OS_STAT_SUSPEND(挂起状态),这样做可以保证任务在未被恢复之前将不会被涉及到OS的任务调度中去。第二步:调用OS_Sched()函数,进行任务切换。
而在我们现在讨论的场景之下,第一步被执行了,但是第二步却被阻止了。于是,由于没有执行任务调度,占用CPU的还是任务B,OSTaskSuspend(B)函数执行完成以后又返回到了任务B当中执行下一条代码,也就是OSSchedUnlock()函数,完成了调度开锁和任务调度操作。
说白了,就是将挂起函数的第二步拖延到调度开锁以后再执行。
-
kankna
-
额……第二句 OSLockNesting++;应该是OSLockNesting--;吧?
这样做可以。
不过直接对OSLockNesting自增和自减而不做任何的保护是有一定风险的,会影响系统的稳定性。你可以用OSSchedLock ()和OSSchedUnlock()来代替,考虑到OSSchedUnlock()中会进行任务调度的问题,可以把这句放到 OSTaskSuspend(B)之后。
又或者至少使用OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来对OSLockNesting自增和自减做保护。
当然以上的两种做法主要是考虑到系统的稳定性问题。如果你的程序本身比较简单的话,就无关紧要了,直接按你自己说的来就行了。恕我啰嗦了,呵呵……
-
err = OSTaskSuspend(OS_PRIO_SELF);//挂起当前任务--自动巡航
当这条语句被执行结束之后,任务AutoModeTask即被挂起,后续的代码不被执行(也就是说StopModeTask这个任务是无法被激活的,而2、3也不会输出),由于此时你的其他两个任务StopModeTask、ManualModeTask也都处于被挂起的状态。因此,此时系统实际上是在运行空闲任务或者统计任务。
这是根据你给出的代码所做的推测,因为不清楚你其他部分的代码是怎么写的,所以仅供参考。
-
别听二楼胡说。之所以会产生你所说的现象,原因在于OSTimeDly()这个函数。在这个函数源代码中存在着OS_EXIT_CRITICAL()这句话。也就是说,你在任务中的操作失效了。但是警告下,在简单的场景下,你可以像现在这样子写,但如果是多个任务,并且具有一定复杂度的时候你再这样写,我保证你程序跑飞……
-
第二个问题。判断是否仍有空余使用的不是OSTCBTbl,而是OSFreeList。OSTCBPrioTbl在你贴出的那一部分代码中是用于判断你想要建立的任务的优先级是不是已经被其它已建立的任务占用了,而不是判断空余的。
-
先说第一个问题吧,if (ptcb != (OS_TCB *)0) 这句话在你的理解中是判断TCB是否为0,也就是TCB是否为未使用的。
但是,实际上,uc/os在这里判断的是在空余TCB池中还有没有TCB,而非是针对TCB本身进行判断。OSTCBFreeList是什么?它是空余TCB链表的表头,当它的值为0时,就意味着已经没有空余TCB了。这就是为什么这段代码最后返回的是
return (OS_NO_MORE_TCB); //没有更多的任务控制块被分配,将无法创建新的任务
而不是TCB已使用的信息了。至于这个TCB是不是为空?抱歉,这里不关心这个问题。
-
第一点,你的理解出错了。代码中查找的是空余的TCB,注意是“空余”。ptcb = OSTCBFreeList;这句话是获取空余TCB链表中OSTCBFreeList所指向的那个TCB,如果链表中已经没有空余TCB了,那么OSTCBFreeList=0,也就是ptcb 所赋的值其实是0。
第二点,OS_TCBPrioTbl和OSTCB事两回事,你搞混了。
-
确实不用加,理由上面几位都说了。但是,这里有一个前提:你是在做实验,而不是在做产品。如果你是做产品,那么你还是加上吧,这是牵涉到一个后期调试还有代码稳定性的问题……
-
那啥,你没明白我的意思。任务的切换不一定是在中断函数中完成的。但是邵贝贝的那句话也没有错,原因是从切换函数(就是汇编代码那里)进入到新的任务执行,这一步必然是需要使用中断返回指令来完成的。
至于你提出的那个替换的问题,抱歉我没有研究过80x86的案例,暂时不能回答,因为这是和硬件相关的,你不能直接就断言可以这样做,至少只更换这一句代码……我估计悬。
-
EXTI_GenerteSWInterrupt函数未定义