博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FreeRTOS-01移植及任务创建和删除
阅读量:5359 次
发布时间:2019-06-15

本文共 8248 字,大约阅读时间需要 27 分钟。

根据正点原子FreeRTOS视频整理

单片机:STM32F207VC

FreeRTOS源码版本:v10.0.1

任务创建和删除API函数:

 

 工程列表:

 1. main.c

1 /**/ 2 #include "main.h" 3 #include "gpio.h" 4 #include "delay.h" 5 #include "sys.h" 6  7 #include "stm32f2xx_gpio.h" 8  9 #include "FreeRTOS.h"10 #include "task.h"11 12 #define START_TASK_PRIO         1     /*任务优先级*/13 #define START_STK_SIZE          128   /*任务堆栈大小*/14 TaskHandle_t StartTask_Handle;        /*任务句柄*/15 void StartTask(void *pvParameters);   /*任务函数*/16 17 #define LED1_TASK_PRIO         218 #define LED1_STK_SIZE          5019 TaskHandle_t LED1Task_Handle;20 void LED1Task(void *pvParameters);21 22 #define LED2_TASK_PRIO         323 #define LED2_STK_SIZE          5024 TaskHandle_t LED2Task_Handle;25 void LED2Task(void *pvParameters);26 27 28 29 /***** 声明 *****/30 static void SystemInitial(void);31 32 33 void StartTask(void *pvParameters)34 {35   taskENTER_CRITICAL();           /*进入临界区*/36   37   xTaskCreate((TaskFunction_t )LED1Task,            /*任务函数*/38                             (const char *   )"LED1Task",            /*任务名称*/39                             (uint16_t       )LED1_STK_SIZE,       /*任务堆栈大小*/40                             (void *         )NULL,                /*传递给任务函数的参数*/41                             (UBaseType_t    )LED1_TASK_PRIO,      /*任务优先级*/42                             (TaskHandle_t   )&LED1Task_Handle);   /*任务句柄*/             43               44   xTaskCreate((TaskFunction_t )LED2Task,45                             (const char *   )"LED2Task",        46                             (uint16_t       )LED2_STK_SIZE,47                             (void *         )NULL,48                             (UBaseType_t    )LED2_TASK_PRIO,49                             (TaskHandle_t   )&LED2Task_Handle);50 51   vTaskDelete(StartTask_Handle);    /*删除开始任务*/52   taskEXIT_CRITICAL();              /*推出临界区*/53 } 54 55 56 void LED1Task(void *pvParameters)57 {58   while (1)59   {60     GPIOE->ODR ^= LED_ALARM;61     vTaskDelay(200);62 //    DelayNms(2);63   }64 } 65 66 void LED2Task(void *pvParameters)67 {68   while (1)69   {70     GPIOE->ODR ^= LED_RUN;71     vTaskDelay(500);72   }73 } 74 75 76 static void SystemInitial(void)77 {78   DelayInitial();79   GPIO_Initial();80 }81 82 int main(void)83 {84   SystemInitial();85  86   87   /*创建开始任务*/88   xTaskCreate((TaskFunction_t )StartTask,           /*任务函数*/89                             (const char *   )"StartTask",            /*任务名称*/90                             (uint16_t       )START_STK_SIZE,      /*任务堆栈大小*/91                             (void *         )NULL,                /*传递给任务函数的参数*/92                             (UBaseType_t    )START_TASK_PRIO,     /*任务优先级*/93                             (TaskHandle_t   )&StartTask_Handle);  /*任务句柄*/             94               95   /*开启任务调度*/96   vTaskStartScheduler();97 }98 99 /***************************END OF FILE***************************/
View Code

 2. main.h

1 /**/ 2 #ifndef __MAIN_H__ 3 #define __MAIN_H__ 4  5  6  7  8 #endif    /*__MAIN_H__*/ 9 10 /***************************END OF FILE***************************/
View Code

3. sys.c

1 /**/2 #include "sys.h"3 #include "stdio.h"4 5 6 /***************************END OF FILE***************************/
View Code

4. sys.h

1 /**/ 2 #ifndef __SYS_H__ 3 #define __SYS_H__ 4  5 /*0不支持OS,1支持OS*/ 6 #define SYSTEM_SUPPORT_OS        1        /*定义系统文件夹是否支持OS*/ 7  8 #endif    /*__SYS_H__*/ 9 10 /***************************END OF FILE***************************/
View Code

5. delay.c

1 /**/ 2 #include "delay.h" 3 #include "sys.h" 4 /*如果需要使用OS,则包括下面的头文件即可*/ 5 #if SYSTEM_SUPPORT_OS 6 #include "FreeRTOS.h"                       7 #include "task.h"  8 #endif 9 10 __IO uint32_t TimingDelay;11 12 /***** 声明 *****/13 extern void xPortSysTickHandler(void);14 15 /*systick中断服务函数,使用FreeRTOS时用到*/16 void SysTick_Handler(void)17 {    18     TimingDelayDecrement();19     20     if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)   /*系统已运行*/21     {22       xPortSysTickHandler();    23     }24 }25 26 void DelayInitial(void)27 {28   /*29      * SystemCoreClock / 1000      1ms中断一次30      * SystemCoreClock / 100000    10us中断一次31      * SystemCoreClock / 1000000   1us中断一次32      */33   if (SysTick_Config(SystemCoreClock / 1000))34   {35     while (1);36   }37   /*关闭systick timer定时器*/38   /*    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;*/39 40   /*使能滴答定时器*/41   SysTick->CTRL |=   SysTick_CTRL_ENABLE_Msk;  42 }43 44 /*45  * 本函数在中断函数中调用,滴答定时器中断一次调用一次。46  */47 void TimingDelayDecrement(void)48 {49     if (TimingDelay != 0x00)50     {51         TimingDelay--;52     }53 }54 55 /*56  * TimingDelay值在TimingDelayDecrement函数中递减57  */58 void DelayNms(uint32_t nTimes)59 {60     TimingDelay = nTimes;61     62     while (TimingDelay!=0);   //等待计数停止63 }64 65 /***************************END OF FILE***************************/
View Code

6. delay.h

1 /**/ 2 #ifndef __DELAY_H__ 3 #define __DELAY_H__ 4  5 #include "stm32f2xx.h" 6  7 #include 
8 9 extern void DelayInitial(void);10 extern void TimingDelayDecrement(void);11 extern void DelayNms(uint32_t nTimes);12 13 #endif /*__DELAY_H__*/14 /***************************END OF FILE***************************/
View Code

7. gpio.c

1 /**/ 2 #include "gpio.h" 3  4 /***** 声明 *****/ 5 static void GPIO_LED_Configuration(void); 6  7  8 void GPIO_Initial(void) 9 {10   GPIO_LED_Configuration();11 }12 13 14 static void GPIO_LED_Configuration(void)15 {16   GPIO_InitTypeDef    GPIO_InitStructure;17   18   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);19   20   GPIO_InitStructure.GPIO_Pin     = LED_POWER | LED_RUN | LED_ALARM;21   GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_OUT;22   GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_100MHz;23   GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;24   GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;25   GPIO_Init(GPIOE, &GPIO_InitStructure);  26   27   LED_Power_On();28   LED_Run_Off();29   LED_Alarm_Off();30 }31 32 /***************************END OF FILE***************************/
View Code

8. gpio.h

1 /**/ 2 #ifndef __GPIO_H__ 3 #define __GPIO_H__ 4  5 #include "stm32f2xx_gpio.h" 6  7 #define LED_POWER         GPIO_Pin_2    /*PE2*/ 8 #define LED_RUN           GPIO_Pin_3    /*PE3*/ 9 #define LED_ALARM         GPIO_Pin_4    /*PE4*/10 11 #define LED_Power_On()    GPIO_ResetBits(GPIOE, LED_POWER)12 #define LED_Power_Off()   GPIO_SetBits(GPIOE, LED_POWER)13 #define LED_Run_On()      GPIO_ResetBits(GPIOE, LED_RUN)14 #define LED_Run_Off()     GPIO_SetBits(GPIOE, LED_RUN)15 #define LED_Alarm_On()    GPIO_ResetBits(GPIOE, LED_ALARM)16 #define LED_Alarm_Off()   GPIO_SetBits(GPIOE, LED_ALARM)17 18 19 extern void GPIO_Initial(void);20 21 #endif  /*__GPIO_H__*/22 /***************************END OF FILE***************************/
View Code

9. 移植过程及问题解决

1. 新建基础例程。2. 在工程目录中添加FreeRTOS源码。3. 在MDK中增加FreeRTOS_CODE和FreeRTOS_POARTABLE组,并添加对应文件。   并包含相应头文件路径。   编译报错:打不开FreeRTOSConfig.h文件。   解决办法:在FreeRTOS源码的例程中,复制一个到FreeRTOS\include文件夹下。   问题:下载程序后,灯不闪烁。   解决1:选择Use MicroLIB后,重新编译。   解决2:新建一个文件(如:sys.c),添加以下内容,添加到工程并编译--正点原子的解决方法。          #include "stdio.h"          #pragma import(__use_no_semihosting)                       //标准库需要的支持函数                           struct __FILE           {             int handle;           };           FILE __stdout;                 //定义_sys_exit()以避免使用半主机模式              void _sys_exit(int x)           {             x = x;           }           //重定义fputc函数           int fputc(int ch, FILE *f)          {                  // while((USART1->SR&0X40)==0);//循环发送,直到发送完毕                // USART1->DR = (u8) ch;                  return ch;          }4. 新建sys.h文件,添加以下内容:    /*0不支持OS,1支持OS*/    #define SYSTEM_SUPPORT_OS		1		/*定义系统文件夹是否支持OS*/5. 在delay.c文件中,增加或修改以下内容:    #include "sys.h"    /*如果需要使用OS,则包括下面的头文件即可*/    #if SYSTEM_SUPPORT_OS    #include "FreeRTOS.h"					      #include "task.h"     #endif    /***** 声明 *****/    extern void xPortSysTickHandler(void);    /*systick中断服务函数,使用FreeRTOS时用到*/    void SysTick_Handler(void)    {	        TimingDelayDecrement();                if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)   /*系统已运行*/        {          xPortSysTickHandler();	        }    }6. main.c函数中新建任务。7. 具体程序参考上面的内容。

  

  

 

转载于:https://www.cnblogs.com/seifguo/p/9208621.html

你可能感兴趣的文章
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
回到顶部浮窗设计
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
$ 一步一步学Matlab(3)——Matlab中的数据类型
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
描绘应用程序级的信息
查看>>
poj2406-Power Strings
查看>>
php环境搭建脚本
查看>>
FTP主动模式与被动模式说明
查看>>