Laz*_*Laz 4 c embedded operating-system microchip freertos
我在PIC32MX入门工具包上使用FreeRTOS端口用于PIC32单片机.只是玩任务但任务不是上下文切换.这是我的主要配置设置:
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
#define configKERNEL_INTERRUPT_PRIORITY 0x01
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x03
#define configTICK_RATE_HZ ( ( portTickType ) 100 )
Run Code Online (Sandbox Code Playgroud)
现在我定义了两个闪烁两个LED的任务.两者的优先级均为4(最高).在正常操作下,LED应该每100个刻度闪烁一次.但这不会发生.第二个LED闪烁100个刻度,控制进入常规异常处理程序.为什么会这样?好像根本没有调度.
FreeRTOS是基于优先级的先发制人调度程序,不会产生处理器时间的相同优先级的任务将被循环调度.依赖循环调度很少适用于实时任务,并且根据配置的时间片,可能会使您的时间陷入困境.甚至可以禁用时间分片.
您的任务必须进入阻止状态,等待某些事件(例如已用时间)以允许彼此按预期运行.
也就是说,进入异常处理程序而不是简单地一个任务饿死另一个或没有按预期的时间运行是另一回事.为此,您需要发布其他信息,但第一种方法应该是部署调试器.
小智 5
首先要检查的是你的"滴答"中断.通常没有启用中断,定时器设置不正确,在设置PIC32的#pragma中没有正确配置时钟......所有这些问题首先表现为缺少"滴答".
这是没有任务切换的首要原因:如果你没有得到嘀嗒中断.这就是正常的先发制人任务切换发生的地方.
假设您正在使用"现成的演示",在MPLAB中,在void vPortIncrementTick( void )
函数中设置一个断点(在FreeRTOS\Source\portable\_PDF\MPLAB\PIC32MX\port.c中的第177行附近)并运行您的代码.如果它在那里断点,你的计时器滴答工作正常.