FreeRTOS移值

FreeRTOS移值

首先需要获取源码包啊:
http://www.freertos.org/到官网下载。
选出一般常用的几个文件:
在这里插入图片描述
在这里插入图片描述
把文件拷贝整理到一个文件夹FreeRTOS.然后把这个文件夹复制到STM32工程里面。
keil添加代码文件:
在这里插入图片描述
添加好之后,keil project添加.C文件
在这里插入图片描述
到此编译一次。
编译过程中会出现报错:未发现FreeRTOSConfig.h这个文件,到官网找一下这个.h,然后复制到自己的工程,我的建议是复制在FreeRTOS这个文件夹里面,方便以后移值。再次编译,还是有报错:void PendSV_Handler(void) void SVC_Handler(void)这两个中断函数重复了。FreeRTOS里面也配置有这两个函数,所以找到STM32工程的STM32F4xx_it.c把这两个函数屏蔽了。
再次编译还会有出错:
void vApplicationIdleHook( void )这个函数没有
u32 getSysTickCnt(void)这个函数没有
void vApplicationMallocFailedHook( void )这个函数没有。一次性添加这三个函数:

void vApplicationIdleHook( void )
{
static u32 tickWatchdogReset = 0;
portTickType tickCount = getSysTickCnt();
if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS)
    {
        tickWatchdogReset = tickCount;
        watchdogReset();
    }
    __WFI(); /*进入低功耗模式*/
}
u32 getSysTickCnt(void)
{
 if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/
  return xTaskGetTickCount();
 else
  return sysTickCnt;
}
void vApplicationMallocFailedHook( void )
{
 portDISABLE_INTERRUPTS();
 while(1);
}

这三个函数添加的位置用户自己决定,我的是添加在STM32F4xx_it.c,方便使用。到此编译没有出现错误,下面就是编写最小的运行代码。
需要建立任务函数:

TaskHandle_t startTaskHandle;
static void startTask(void *arg);
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
/*创建任务*/
void startTask(void *arg)
{
taskENTER_CRITICAL(); /*进入临界区*/
xTaskCreate(led0_task, "LED0_TASK", 150, NULL, 3, (TaskHandle_t*  )&LED0Task_Handler);  /*创建无线连接任务*/
xTaskCreate(led1_task, "LED1_TASK", 150, NULL, 4, (TaskHandle_t*  )&LED1Task_Handler);  /*创建usb接收任务*/
vTaskDelete(startTaskHandle);          /*删除开始任务*/
taskEXIT_CRITICAL(); /*退出临界区*/
}
uint32 LED0_Count, LED1_Count;
uint32 Sys_Time, Sys_TimeP;
//LED0任务函数 
void led0_task(void *param)
{
while(1)
    {
   Sys_Time = getSysTickCnt();
       LED0_Count ++;
        vTaskDelay(1000);
   Sys_TimeP = getSysTickCnt() - Sys_Time;
  }
}
//LED1任务函数
void led1_task(void *param)
{
while(1)
  {
    LED1_Count ++;
    vTaskDelay(1000);
  }
}
还有一个注意的点就是滴答定时器中断里面的处理,少了这个系统运行不正常的哦
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/
    {
        xPortSysTickHandler(); 
    }else
 {
  sysTickCnt++; /*调度开启之前计数*/
 }
}

直接跑仿真,根据LED0_Count、LED1_Count这两个变量去判断代码运行情况,祝你成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值