TA的每日心情 | 开心 2017-7-4 13:51 |
---|
签到天数: 347 天 连续签到: 1 天 [LV.8]以坛为家I
|
最近听网友推荐尝试了下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此处所用的启动文件与正常外设例程所用的启动文件是同一个,这说明要么就是没改,要么就是之前所有例程一直用的是移植修改后的启动文件。到目前为止没找到不同 |
|