查看: 801|回复: 0

【LPC54100】零基础学freertos

[复制链接]
  • TA的每日心情
    开心
    2017-7-4 13:51
  • 签到天数: 347 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-27 09:01:31 | 显示全部楼层 |阅读模式
    分享到:
    最近听网友推荐尝试了下LPCXpresso,发现确实好用,当然是针对nxp的芯片板子而言。至少找具体的某引脚的定义啊,函数的定义啊,都能准确跳转,还能进行仿真(反正这板子我用mdk是没仿真请来),真是太让人感动了,不过最大的缺点大概就是编译时间会很长。
    单片机的外设用过很多,可一直没跑过操作系统,借此机会研究下。
    对于小型单片机而言,常跑的操作系统主要是UCOSII、FreeRTOS、embOS等,相较而言FreeRTOS是免费的,并且源码公开,移植方便,所以当然就先研究这个了。
    下面引用百科里一段对FreeRTOS的定义:
    FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
    FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
    这段话对FreeRTOS具体的功能等讲的很清楚。基于上述所说,通过实际程序来理解下。
    NXP提供了一个关于FreeRTOS闪灯的例程,可以说是移植FreeRTOS最好的入门了。

    下面通过对FreeRTOS理论的理解,结合程序来具体分析下,呵呵,初次学习,不足之处还望指正!
    int main(void){        prvSetupHardware();        /* LED1 toggle thread */        xTaskCreate(vLEDTask1, "vTaskLed1",                                configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),                                (xTaskHandle *) NULL);        /* LED2 toggle thread */        xTaskCreate(vLEDTask2, "vTaskLed2",                                configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),                                (xTaskHandle *) NULL);        /* UART output thread, simply counts seconds */        xTaskCreate(vUARTTask, "vTaskUart",                                configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL),                                (xTaskHandle *) NULL);        /* Start the scheduler */        vTaskStartScheduler();        /* Should never arrive here */        return 1;}由主函数可知,一共实现了3个任务。vLEDTask1、vLEDTask2、vUARTTask。前两个是关于led的,后一个是关于串口的。代码如下所示:
    /* LED1 toggle thread */static void vLEDTask1(void *pvParameters) {        bool LedState = false;        while (1) {                Board_LED_Set(0, LedState);                LedState = (bool) !LedState;                /* About a 3Hz on/off toggle rate */                vTaskDelay(configTICK_RATE_HZ / 6);        }}/* LED2 toggle thread */static void vLEDTask2(void *pvParameters) {        bool LedState = false;        while (1) {                Board_LED_Set(1, LedState);                LedState = (bool) !LedState;                /* About a 7Hz on/off toggle rate */                vTaskDelay(configTICK_RATE_HZ / 14);        }}/* UART (or output) thread */static void vUARTTask(void *pvParameters) {        int tickCnt = 0;        while (1) {                DEBUGOUT("Tick: %d \r\n", tickCnt);                tickCnt++;                /* About a 1s delay here */                vTaskDelay(configTICK_RATE_HZ);        }}具体任务的创建,FreeRTOS提供了源码。

    freertos目录下的就是提供的关于freertos系列操作的源码,example目录下的就是实际应用部分的源码。
    具体任务创建部分可以看task.h文件
    任务创建完成那就得启动任务,所以主函数中调用vTaskStartScheduler();来启动任务。
    当然如果想对创建好的任务进行其他操作,如删除啊,停止啊,就调用task.c文件中的函数。
    freertos的任务挂起与ucosii等其他的不大一样。它把 所有挂起的任务加到xSuspendedTaskList中,而且一旦调用vTaskSuspend()函数挂起一个任务,该任务就将从所有它原先连入的链表中删除(包括就绪表,延时表和它等待的事件链表),也就是说,和 ucosii不同,一旦一个任务被挂起,它将取消先前它的延时和对事件的等待。ucosii中是不同的,在ucosii里 面一个任务被挂起仅仅是把任务的状态或上一个OS_STAT_SUSPEND并从就绪表中删除,如果先前这个任务正在等待某事件,则并不取消等待。
    FreeRTOS的移植除了得将关于FreeRTOS的文件夹的资料移入,还得修改启动文件。这点在我尝试在stm32上移植FreeRTOS得到证实,可是nxp此处所用的启动文件与正常外设例程所用的启动文件是同一个,这说明要么就是没改,要么就是之前所有例程一直用的是移植修改后的启动文件。到目前为止没找到不同
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 22:32 , Processed in 0.133027 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.