STM32F103C8T6的FreeRtos工程。
带部分中文注释。希望可以帮组初学者。
单片机源程序如下:
- /* Standard includes. */
- #include <stdio.h>
- /* Scheduler includes. */
- #include "FreeRTOS.h"
- #include "task.h"
- #include "queue.h"
- /* Library includes. */
- #include "stm32f10x_it.h"
- /* Demo app includes. */
- #include "lcd.h"
- #include "LCD_Message.h"
- #include "BlockQ.h"
- #include "death.h"
- #include "integer.h"
- #include "blocktim.h"
- #include "partest.h"
- #include "semtest.h"
- #include "PollQ.h"
- #include "flash.h"
- #include "comtest2.h"
- /* Task priorities. */
- #define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
- #define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
- #define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
- #define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
- #define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
- #define mainFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
- #define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
- #define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY )
- /* Constants related to the LCD. */
- #define mainMAX_LINE ( 240 )
- #define mainROW_INCREMENT ( 24 )
- #define mainMAX_COLUMN ( 20 )
- #define mainCOLUMN_START ( 319 )
- #define mainCOLUMN_INCREMENT ( 16 )
- /* The maximum number of message that can be waiting for display at any one
- time. */
- #define mainLCD_QUEUE_SIZE ( 3 )
- /* The check task uses the sprintf function so requires a little more stack. */
- #define mainCHECK_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 )
- /* Dimensions the buffer into which the jitter time is written. */
- #define mainMAX_MSG_LEN 25
- /* The time between cycles of the 'check' task. */
- #define mainCHECK_DELAY ( ( TickType_t ) 5000 / portTICK_PERIOD_MS )
- /* The number of nano seconds between each processor clock. */
- #define mainNS_PER_CLOCK ( ( unsigned long ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) )
- /* Baud rate used by the comtest tasks. */
- #define mainCOM_TEST_BAUD_RATE ( 115200 )
- /* The LED used by the comtest tasks. See the comtest.c file for more
- information. */
- #define mainCOM_TEST_LED ( 3 )
- /*-----------------------------------------------------------*/
- /*
- * Configure the clocks, GPIO and other peripherals as required by the demo.
- */
- static void prvSetupHardware( void );
- /*
- * Configure the LCD as required by the demo.
- */
- static void prvConfigureLCD( void );
- /*
- * The LCD is written two by more than one task so is controlled by a
- * 'gatekeeper' task. This is the only task that is actually permitted to
- * access the LCD directly. Other tasks wanting to display a message send
- * the message to the gatekeeper.
- */
- static void vLCDTask( void *pvParameters );
- /*
- * Retargets the C library printf function to the USART.
- */
- int fputc( int ch, FILE *f );
- /*
- * Checks the status of all the demo tasks then prints a message to the
- * display. The message will be either PASS - and include in brackets the
- * maximum measured jitter time (as described at the to of the file), or a
- * message that describes which of the standard demo tasks an error has been
- * discovered in.
- *
- * Messages are not written directly to the terminal, but passed to vLCDTask
- * via a queue.
- */
- static void vCheckTask( void *pvParameters );
- /*
- * Configures the timers and interrupts for the fast interrupt test as
- * described at the top of this file.
- */
- extern void vSetupTimerTest( void );
- /*-----------------------------------------------------------*/
- /* The queue used to send messages to the LCD task. */
- QueueHandle_t xLCDQueue;
- /*-----------------------------------------------------------*/
- int main( void )
- {
- #ifdef DEBUG
- debug();
- #endif
- prvSetupHardware();
- /* Create the queue used by the LCD task. Messages for display on the LCD
- are received via this queue. */
- xLCDQueue = xQueueCreate( mainLCD_QUEUE_SIZE, sizeof( xLCDMessage ) ); //创建LCD列队,并返回列队编号
- /* Start the standard demo tasks. */
- vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); //创建了6个任务,处理三组参数
- vCreateBlockTimeTasks(); //创建两个block任务 阻塞任务
- vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); //
- vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); //创建列队测试任务 待挖掘
- vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); //
- vStartLEDFlashTasks( mainFLASH_TASK_PRIORITY ); //创建LED翻转任务,创建了3个相同的任务,每个对应不同的灯
- vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED ); //创建串口收发任务,收和发是两个任务
- /* Start the tasks defined within this file/specific to this demo. */
- xTaskCreate( vCheckTask, "Check", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); //创建LCD内容显示设置任务
- xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); //创建LCD显示任务
- /* The suicide tasks must be created last as they need to know how many
- tasks were running prior to their creation in order to ascertain whether
- or not the correct/expected number of tasks are running at any given time. */
- vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); //创建一批可以自动删除的任务
- /* Configure the timers used by the fast interrupt timer test. */
- vSetupTimerTest(); //初始化定时器
- /* Start the scheduler. */
- vTaskStartScheduler(); //启动调度器,开始操作系统
- /* Will only get here if there was not enough heap space to create the
- idle task. */
- return 0;
- }
- /*-----------------------------------------------------------*/
- void vLCDTask( void *pvParameters )
- {
- xLCDMessage xMessage;
- /* Initialise the LCD and display a startup message. */
- prvConfigureLCD();
- LCD_DrawMonoPict( ( unsigned long * ) pcBitmap );
- for( ;; )
- {
- /* Wait for a message to arrive that requires displaying. */
- while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS ); //从序列中读取数据,返回有没有
- /* Display the message. Print each message to a different position. */
- printf( ( char const * ) xMessage.pcMessage );
- }
- }
- /*-----------------------------------------------------------*/
- static void vCheckTask( void *pvParameters )
- {
- TickType_t xLastExecutionTime;
- xLCDMessage xMessage;
- static signed char cPassMessage[ mainMAX_MSG_LEN ];
- extern unsigned short usMaxJitter;
- xLastExecutionTime = xTaskGetTickCount();
- xMessage.pcMessage = cPassMessage;
- for( ;; )
- {
- /* Perform this check every mainCHECK_DELAY milliseconds. */
- vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); //绝对延时,如果某个延时被任务耽搁了,会在下一次调用时补偿回来
- /* Has an error been found in any task? */
- if( xAreBlockingQueuesStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN BLOCK Q\n";
- }
- else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN BLOCK TIME\n";
- }
- else if( xAreSemaphoreTasksStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN SEMAPHORE\n";
- }
- else if( xArePollingQueuesStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN POLL Q\n";
- }
- else if( xIsCreateTaskStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN CREATE\n";
- }
- else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN MATH\n";
- }
- else if( xAreComTestTasksStillRunning() != pdTRUE )
- {
- xMessage.pcMessage = "ERROR IN COM TEST\n";
- }
- else
- {
- sprintf( ( char * ) cPassMessage, "PASS [%uns]\n", ( ( unsigned long ) usMaxJitter ) * mainNS_PER_CLOCK );
- }
- /* Send the message to the LCD gatekeeper for display. */
- xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );
- }
- }
- /*-----------------------------------------------------------*/
- static void prvSetupHardware( void )
- {
- /* Start with the clocks in their expected state. */
- RCC_DeInit();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
FreeRTOS-project STM32.7z
(3.09 MB, 下载次数: 56)
|