| #申请原创# @21小跑堂 10.初试FreeRTOS
 还是第一次接触FreeRTOS,慢慢学习
 RTOS即Real Time Operating System 实时操作系统,FreeRTOS是一个免费开源并且应用非常广泛的RTOS
 平常的裸机编程在初始化完成之后,所有的操作都在while(1)这个大循环里按顺序完成,如果某一个操作比较耗时就会在这里多阻塞一会而影响后面操作的执行,例如下面这段代码
 
 
 在按住KEY1不松开时就会一直卡在while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);这里,后面KEY2的按键状态就没法判断了int main(void)
{
    APM_DelayInit();
    APM_TINY_LEDInit(LED2);
    APM_TINY_LEDInit(LED3);
    APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
    APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
    while (1)
    {
        if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
        {
            APM_DelayMs(30);
            if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
            {
                while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
                APM_TINY_LEDToggle(LED2);
            }
        }
        if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
        {
            APM_DelayMs(30);
            if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
            {
                while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
                APM_TINY_LEDToggle(LED3);
            }
        }
    }
}
而在RTOS下可以为这两个按键单独创建2个任务,2个任务独立执行,类似于电脑操作系统里的多线程
 不过既然叫OS运行必定要耗费一定的资源,APM32F407的性能还是可以支持RTOS的运行的,在官方的例程里已经有了FreeRTOS的例程,接下来通过这个例程来了解一下FreeRTOS
 这个例程是基于MINI board的,先改一下换成TINY board,修改宏定义
 
   替换main.c中的MINI为TINY
 
   
   编译运行
 
   接下来在这个工程的基础上改一下按键点灯的程序,让两个按键可以独立检测
 代码示例
 
 
 运行效果static TaskHandle_t xHandleKey1Task = NULL;
static TaskHandle_t xHandleKey2Task = NULL;
int main(void)
{
    APM_TINY_LEDInit(LED2);
    APM_TINY_LEDInit(LED3);
    APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
    APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
    /** User create task */
    UserTaskCreate();
    /** Startup FreeRTOS */
    vTaskStartScheduler();
    while(1);
}
void vKey1checkTask(void *pvParameters)
{
    while(1)
    {
        if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
        {
            vTaskDelay(30);
            if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
            {
                while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
                APM_TINY_LEDToggle(LED2);
            }
        }
    }
}
    
void vKey2checkTask(void *pvParameters)
{
    while(1)
    {
        if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
        {
            vTaskDelay(30);
            if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
            {
                while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
                APM_TINY_LEDToggle(LED3);
            }
        }
    }
}
static void UserTaskCreate(void)
{
    xTaskCreate(vKey1checkTask,"Key1checkTask",128,NULL,0,&xHandleKey1Task);
    xTaskCreate(vKey2checkTask,"Key2checkTask",128,NULL,0,&xHandleKey2Task);
}
 
   可以看到一个按键保持按下,另一个按键也能正常工作
 |