1.准备工作
2.新建文件夹及复制必要文件
2.1、新建7个文件夹
.\freeRTOS
.\freeRTOS\include
.\freeRTOS\port
.\freeRTOS\src
.\Library
.\Project
.\User
2.2、把源码FreeRTOSv9.0.0\FreeRTOS\Source\include中的文件全部复制到新建的include文件夹
2.3、把源码FreeRTOSv9.0.0\FreeRTOS\Source\portable中MemMang文件夹复制到新建的port文件夹中
2.4、把源码portable\RVDS中的ARM_CM3复制到port文件夹中
2.5、把源码FreeRTOSv9.0.0\FreeRTOS\Source文件夹中的*.c文件全部复制到新建的src文件夹中
2.6、把CMSIS和FWlib文件夹复制到新建Library文件夹中
2.7、User文件中新建一个main.c,然后复制标准库中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h文件到User文件夹中
2.8、把FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil中FreeRTOSConfig.h复制到include文件夹中
3.添加c文件
3.1、打开Keil uVision5新建工程,Project-NEW uVision project,选中Project文件夹,输入工程名称,保存。
3.2、芯片选择STM32F103C8,确定,再确定。
3.3、打开管理工程项目,分别新建freeRTOS/port、freeRTOS/src、CMSIS、FWLIB、USER
3.4、freeRTOS/port中分别添加ARM_CM3\port.c和MemMang\heap_4.c两个文件
3.5、freeRTOS/src添加freeRTOS\src文件夹下的所有c文件
3.6、CMSIS添加Library\CMSIS\startup\startup_stm32f10x_md.s、Library\CMSIS\core_cm3.c、Library\CMSIS\system_stm32f10x.c三个文件
3.7、FWLIB添加Library\FWlib\src文件夹下所有的*.c文件
3.8、USER添加main.c、stm32f10x_it.c,如果这里有其他自己编写的代码,也可以放再这里。比如LED,KEY,USART相关代码
4.配置运行环境
4.1、在C/C++选项卡,Define输入:STM32F10X_MD,USE_STDPERIPH_DRIVER
4.2、在C/C++中,包含include路径:freeRTOS\include、freeRTOS\port\ARM_CM3、Library\CMSIS、Library\FWlib\inc、User
如果还有自己编写的其他头文件,也一起包含在里面。如LED,KEY,USART
4.3、使用MicroLIB库,
5.代码修改
5.1、在freeRTOS中,已经为用户实现了SVC_Handle()和PendSV_Handler()函数,需要注释掉,修改stm32f10x_it.c文件
- *
- //void SVC_Handler(void)
- //{
- //}
- *
- //void PendSV_Handler(void)
- //{
- //}
- *
- /*在c文件中添加如下代码*/
- /*freeRTOS中的systick中断函数*/
- extern void xPortSysTickHandler(void);
- void SysTick_Handler(void)
- {
- #if(INCLUDE_xTaskGetSchedulerState==1)
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED){
- #endif
- xPortSysTickHandler();
- #if (INCLUDE_xTaskGetSchedulerState==1)
- }
- #endif
- }
复制代码
5.2、修改一下"FreeRTOSConfig.h",这里我使用软件定时器,需要打开对应宏定义,还要配置FreeRTOS与中断服务函数有关定义
- /*FreeRTOS与中断服务函数的配置选项*/
- #define xPortPendSVHandler PendSV_Handler
- #define vPortSVCHandler SVC_Handler
- /*启用软件定时器相关宏定义*/
- #define configUSE_TIMERS 1
- #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1)
- #define configTIMER_QUEUE_LENGTH 10
- #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2)
复制代码
5.3、最后就是添加外设初始化代码,主函数里面添加任务代码。main.c代码如下
- #include "FreeRTOS.h"
- #include "task.h"
- #include "bsp_led.h"
- #include "bsp_usart.h"
- #include "bsp_key.h"
- #include "queue.h"
- #include "semphr.h"
- #include "event_groups.h"
- #include "timers.h"
- /*Function definition*/
- static void BSP_Init(void);
- static void Send_Task(void* pvParameters);
- static void Callback_LEDTOGGLE(void* pvParameters);
- static void AppTaskCreate(void);
- /*Task Handle*/
- static TaskHandle_t AppTaskCreate_Handle=NULL;
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
- /*Timer handle*/
- static TimerHandle_t Timer1=NULL;
- static void Callback_LEDTOGGLE(void* pvParameters)
- {
- LED1_TOGGLE;
- printf("TickValue=%d\n",(TickType_t)xTaskGetTickCount());
- }
- int main(void)
- {
- BaseType_t xReturn =pdPASS;
- BSP_Init();
- printf("FreeRTOS creates tasks dynamically!\r\n");
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
- (const char *)"APPTASKCREATE",\
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
- (TaskHandle_t*)&AppTaskCreate_Handle);
- if(pdPASS==xReturn)
- vTaskStartScheduler();
- else
- return -1;
- while(1);
- }
- /*Hardware initialization*/
- static void BSP_Init(void)
- {
- /*Use this priority grouping uniformly, never group again
- * 4 bits for pre-emption priority
- */
- /*led initialization*/
- LED_GPIO_Config();
- /*Serial port initialization*/
- USART_Config();
- /*Key initialization*/
- Key_GPIO_Config();
- }
- /***********
- *@Function name:SEND_Task
- *@description:SEND_Task body
- *@Parameter:None
- *@return:None
- *************/
- static void Send_Task(void* pvParameters)
- {
- while(1)
- {
- vTaskDelay(100); //只是为了演示任务切换
- }
- }
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn=pdPASS;
- taskENTER_CRITICAL();
- /* Create Timer1 Handle*/
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
- if(NULL!=Timer1)
- printf("Timer1 created successfully.\r\n");
- xTimerStart(Timer1,0);
- /*SEND task*/
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
- (const char*)"SEND_TASK",\
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
- (TaskHandle_t)&Send_Task_Handle);
- if(pdPASS==xReturn)
- printf("\r\nCreate Send_Task success!\r\n");
- vTaskDelete(AppTaskCreate_Handle);
- taskEXIT_CRITICAL();
- }
- /*********************************************END OF FILE**********************/
复制代码
————————————————
版权声明:SCCELE
|