stm32f103中freertos的tasks基本使用案例及备忘
基本实例
   freetos的在stm32中使用踩了一些坑,事情做完了,就 做个备忘,希望能给后面的人一些借鉴。
先给出一个实际的例子吧。
- 启动代码
 
void task_create(void)
{
    xTaskCreate(vButtonCheckTask,"Button",configMINIMAL_STACK_SIZE,NULL,configMAX_PRIORITIES-1,NULL);
    xTaskCreate(vButtonLEDsTask,"ButtonLeds",configMINIMAL_STACK_SIZE,NULL,configMAX_PRIORITIES-1,NULL);
}
- 回调函数
 
static void vButtonCheckTask( void *pvParameters )
{
  //for debounce
  static uint8_t count;
  portTickType xLastWakeTime;
  const portTickType xFrequency = 20;
  const portTickType yDelay = 20 / portTICK_RATE_MS;
  xLastWakeTime=xTaskGetTickCount();
  //create semaphores for each button
  vSemaphoreCreateBinary(xButtonWakeupSemaphore);
  vSemaphoreCreateBinary(xButtonUser1Semaphore);
  vSemaphoreCreateBinary(xButtonUser2Semaphore);
//check if semaphores were created successfully
  if((xButtonWakeupSemaphore!=NULL)&&(xButtonUser1Semaphore!=NULL)&&(xButtonUser2Semaphore!=NULL))
  {
    //successfully created
    //resets initial semaphores to 0
    xSemaphoreTake(xButtonWakeupSemaphore, (portTickType)0);
    xSemaphoreTake(xButtonUser1Semaphore, (portTickType)0);
    xSemaphoreTake(xButtonUser2Semaphore, (portTickType)0);
  }  else {
      //send error of failure
  }
  for (;;)
    {
      if (ButtonRead(BWAKEUPPORT, BWAKEUP)==pdTRUE)
        {
          vTaskDelay(yDelay);
          if(ButtonRead(BWAKEUPPORT, BWAKEUP)==pdTRUE)
          {
              while(ButtonRead(BWAKEUPPORT, BWAKEUP)==pdTRUE);
              xSemaphoreGive(xButtonWakeupSemaphore);
              //LEDToggle(1);
              usart1_puts(" key1 pressed \r\n");
              //printf(" led 1 on\r\n");
          }
        }
      if (ButtonRead(BUSER1PORT, BUSER1)==pdTRUE)
        {
          vTaskDelay(yDelay);
          if(ButtonRead(BUSER1PORT, BUSER1)==pdTRUE)
          {
              while(ButtonRead(BUSER1PORT, BUSER1)==pdTRUE);
              //LEDToggle(1);
              //printf(" use1 presssed\n\r");
              usart1_puts("key2 presssed\n\r");
              xSemaphoreGive(xButtonUser1Semaphore);
          }
        }
      if (ButtonRead(BUSER2PORT, BUSER2)==pdTRUE)
        {
          vTaskDelay(yDelay);
          if(ButtonRead(BUSER2PORT, BUSER2)==pdTRUE)
          {
              while(ButtonRead(BUSER2PORT, BUSER2)==pdTRUE);
              usart1_puts("key3 presssed \n\r");
              //xSemaphoreGive(xButtonUser2Semaphore);
          }
        }
    }
}
void vButtonLEDsTask( void *pvParameters )
{
  const portTickType xDelay = 50 / portTICK_RATE_MS;
  for( ;; )
  {
      if((xButtonWakeupSemaphore!=NULL)&&(xButtonUser1Semaphore!=NULL)&&(xButtonUser2Semaphore!=NULL))
      {
         if (xSemaphoreTake(xButtonWakeupSemaphore, (portTickType)10)==pdTRUE)
             {
               //LEDOn(1);
               usart1_puts("led1 on \n\r");
               LEDToggle(1);
               //give semaphore back
               //xSemaphoreGive(xButtonWakeupSemaphore);
             }
         if (xSemaphoreTake(xButtonUser1Semaphore, (portTickType)10)==pdTRUE)
             {
               usart1_puts("led2 on \n\r");
               LEDToggle(2);
               //LEDOn(2);
               //xSemaphoreGive(xButtonUser1Semaphore);
             }
         if (xSemaphoreTake(xButtonUser2Semaphore, (portTickType)10)==pdTRUE)
             {
               usart1_puts("led3 on \n\r");
               //LEDToggle(3);
               //LEDOn(2);
               //xSemaphoreGive(xButtonUser2Semaphore);
             }
      }
    //usart1_puts("task running \n\r");
    vTaskDelay(xDelay);
    //vTaskDelayUntil(&xLastWakeTime,xFrequency);
  }
}
重要备忘
   freetos的task和里面的函数尽量在一个文件中。
对于某些stm32 的平台,回调函数和task不在一个文件下,会出现一些异常。
freetos的task的回调函数尽量使用静态函数:
   freetos的task中的循环中一定不能丢了
vTaskDelay(xDelay);不然会出现一直循环,被调度不到的情况,特别是你的task优先级比较高的时候。
stm32f103中freertos的tasks基本使用案例及备忘的更多相关文章
- JAVA中获得一个月最大天数的方法(备忘)
		
Calendar 类是一个抽象类,为日历字段之间的转换提供了一些方法.其中有一个重要方法 getActualMaximum ,该方法用于返回指定日历字段实际的最大值. 利用这个方法(Calendar. ...
 - 从3dmax中导入模型到UDK Editor(供个人备忘)
		
笔记从3dmax中导入模型到UDK Editor 1) 在3dmax中导出 2) 选择FBX格式,保存 3) 在UDK中打开content browser,自己选个pac ...
 - c++中的dictionary对象:map的使用备忘
		
#include <map> #include <iostream> using namespace std; void main(){ map <string, int ...
 - Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例
		
1. 把集合中的数据存储到文本文件案例: 需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...
 - Laravel 中使用 swoole 项目实战开发案例二 (后端主动分场景给界面推送消息)
		
推荐阅读:Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信) 需求分析 我们假设有一个需求,我在后端点击按钮 1,首页弹出 “后端触发了按钮 1”.后端点了 ...
 - arduino中SCoop库的简单应用案例
		
转载:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html arduino中SCoop库的简单应用案例首先这篇文章来在视频https://v ...
 - 【C#】无损转换Image为Icon   【C#】组件发布:MessageTip,轻快型消息提示窗  【C#】给无窗口的进程发送消息  【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方  【C#】DataRowState演变备忘
		
[C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...
 - ECMAScript 5(ES5)中bind方法简介备忘
		
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
 - 项目中oracle存储过程记录——经常使用语法备忘
		
项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...
 
随机推荐
- 转: VS 解决方案目录结构设置
			
https://www.cnblogs.com/zuibunan/p/3843459.html 下面的文章也有介绍 https://blog.csdn.net/lp310018931/article/ ...
 - JVM内存模型以及HotSpot的GC策略
			
概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳 ...
 - 深入浅出Mybatis系列五-TypeHandler简介及配置(mybatis源码篇)
			
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliase ...
 - LeetCode Continuous Subarray Sum 题解 同余前缀和 Hash表
			
文章目录 题意 思路 特殊情况k=0 Source Code 1 Source Code 2 题意 给定一个数组和一个整数k,返回是否存在一个长度至少为2的连续子数组的和为k的倍数. 思路 和上一篇博 ...
 - BandwagonHost VPS CentOS7系统启用EPEL源
			
BandwagonHost默认安装好了EPEL源,只是默认没有启用,所以很多软件都无法安装.我们需要手动启用一下,才能安装里面的软件. # vim /etc/yum.repos.d/epel.repo ...
 - 销量下跌、质量问题不断,小鹏G3“维权门”之后的日子不好过
			
编辑 | 于斌 出品 | 于见(ID:mpyujian) 小鹏汽车何时能站上国内新能源汽车行业C位?这是于见之前提出过的问题.随着上个月小鹏汽车终于发布了2020款小鹏G3,从该款产品的用户反馈及销量 ...
 - 165.扩展User模型-继承AbstractBaseUser
			
继承自AbstractBaseUser模型 如果你想要修改默认的验证方式,并且对于User模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser,再添加你想要的字段 ...
 - CodeForce 377 A mazes(dfs+连通性问题)
			
Pavel 喜欢网格迷宫.一个网格迷宫是一个 n × m 的长方形迷宫,其中每个单元格要么是空白的,要么是墙体.您可以从一个单元格走到另一个单元格,只要两个单元格均是空白的,且拥有一条公共的边. Pa ...
 - docker 免sudo设置(仅3个命令)
			
首先,下载docker, 需3话: sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docke ...
 - mysql数据库-笔记
			
基本概念篇 SQL语言的分类(DDL.DML.DCL.DQL) 对应的英文全程:data (definition.manipulation.control.query)language 参考资料: h ...