【正点原子STM32连载】 第五十五章 FreeRTOS移植实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第五十五章 FreeRTOS移植实验

前面章节中的实验都是在裸机环境下实现,本章将介绍FreeRTOS的简单使用,对RTOS感兴趣的读者,可以参考正点原子推出的FreeRTOS或µC/OS-III的全套教程资料,包含教学视频、开发指南并配套有例程源码。通过本章的学习,读者将学习到FreeRTOS的简单应用。
本章分为如下几个小节:
55.1 硬件设计
55.2 程序设计
55.3 下载验证

55.1 硬件设计
55.1.1 例程功能

  1. LED0由LED0任务控制80毫秒亮,920毫秒灭
  2. LED1由LED1任务控制300毫秒亮,300毫秒灭
    55.1.2 硬件资源
  3. LED
    LED0 - PB5
    LED1 - PE5
    55.1.3 原理图
    本章实验使用的FreeRTOS为软件库,因此没有对应的连接原理图。
    55.2 程序设计
    55.2.1 FreeRTOS的移植
    FreeRTOS的源码可参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频至FreeRTOS的官网下载,也可在A盘6,软件资料FreeRTOS学习资料中找到。
    FreeRTOS的移植请读者参考正点原子推出的《FreeRTOS开发指南》或相关的配套教学视频,在上述资料中,对FreeRTOS的移植和使用都做了非常详细地介绍,是入门FreeRTOS的一个非常好的选择。
    55.2.2 实验应用代码
    本章实验的应用代码,如下所示:
/* START_TASK任务配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_PRIO 1               /* 任务优先级 */
#define START_STK_SIZE  128             /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler;         /* 任务句柄 */
void start_task(void *pvParameters);    /* 任务函数 *//* LED0任务配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define LED0_PRIO      2                /* 任务优先级 */
#define LED0_STK_SIZE  128              /* 任务堆栈大小 */
TaskHandle_t LED0Task_Handler;          /* 任务句柄 */
void led0_task(void *pvParameters);     /* 任务函数 *//* LED1任务配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define LED1_PRIO      2                				/* 任务优先级 */
#define LED1_STK_SIZE  128              				/* 任务堆栈大小 */
TaskHandle_t LED1Task_Handler;          				/* 任务句柄 */
void led1_task(void *pvParameters);     				/* 任务函数 */int main(void)
{NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  	/* 设置中断优先级分组为组4 */sys_apm32_clock_init(15);                         	/* 配置系统时钟 */delay_init(120);                                  	/* 初始化延时功能 */usart_init(115200);                               	/* 初始化串口 */led_init();                                       	/* 初始化LED */xTaskCreate((TaskFunction_t )start_task,          	/* 任务函数 */(const char*    )"start_task",        	/* 任务名称 */(uint16_t       )START_STK_SIZE,      	/* 任务堆栈大小 */(void*          )NULL,                	/* 传入给任务函数的参数 */(UBaseType_t    )START_TASK_PRIO,		/* 任务优先级 */(TaskHandle_t*  )&StartTask_Handler)/* 任务句柄 */vTaskStartScheduler();
}

从上面的代码中可以看出,在完成必要的初始化后,便创建了“start_task”任务,随后便开始了任务调度,“start_task”任务的入口函数为函数start_task(),如下所示:

/*** @brief       start_task* @param       pvParameters: 传入参数(未用到)* @retval      无*/
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           /* 进入临界区 *//* 创建LED0任务 */xTaskCreate((TaskFunction_t )led0_task,(const char*    )"led0_task",(uint16_t       )LED0_STK_SIZE,(void*          )NULL,(UBaseType_t    )LED0_PRIO,(TaskHandle_t*  )&LED0Task_Handler);/* 创建LED1任务 */xTaskCreate((TaskFunction_t )led1_task,(const char*    )"led1_task",(uint16_t       )LED1_STK_SIZE,(void*          )NULL,(UBaseType_t    )LED1_PRIO,(TaskHandle_t*  )&LED1Task_Handler);vTaskDelete(StartTask_Handler); /* 删除开始任务 */taskEXIT_CRITICAL();            /* 退出临界区 */
}
从上面的代码中可以看出,“start_task”任务主要用于创建“led0_task”和“led1_task”任务,这两个任务的入口函数,如下所示:
/*** @brief       LED0任务* @param       pvParameters: 传入参数(未用到)* @retval      无*/
void led0_task(void *pvParameters)
{while(1){LED0(0);vTaskDelay(80);LED0(1);vTaskDelay(920);}
}/*** @brief       LED1任务* @param       pvParameters: 传入参数(未用到)* @retval      无*/
void led1_task(void *pvParameters)
{while(1){LED1(0);vTaskDelay(300);LED1(1);vTaskDelay(300);}
}

可以看到,两个任务分别控制开发板板载的两个LED闪烁,但其闪烁的频率和亮灭时间都不相同,因此因该能看到开发板板载的两个LED以不同的频率和不同的亮灭时间进行闪烁。
55.3 下载验证
在完成编译和烧录操作后,可以看到开发板板载的两个LED以不用的频率和不同的亮灭时间闪烁着,其中LED0在一个闪烁周期内的亮灭时间约分别为80毫秒和920毫秒,LED1在一个闪烁周期内的亮灭时间约分别为300毫秒和300毫秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Python制定旅行计划

编写一个Python脚本,用于制定旅行计划。这个脚本将询问关于旅行的基本问题,并根据回答生成一旅行计划。以下是示例脚本: def create_travel_plan(): # 询问用户目的地 destination = input("请输入您的目的地:") # 询问旅行日期 start_date = input("请…

【Kuiperinfer】笔记02 GoogleTest入门

文章目录 Google Test基本概念 编写测试头文件AssertionTESTTest FixtureInvoking the Tests编写main()函数 参考 Google Test Google Test是用于编写C测试的框架,支持多种类型的测试,而不是只有单元测试(unit test)。 编写测试…

weblogic8版本修改控制台密码

weblogic的8.1老版本在控制台界面上没有修改密码的按钮选项,因此需要通过修改服务器配置文件来更新密码。 步骤1: 备份域目录下的DefaultAuthenticatorInit.ldift文件 通过find /域目录 -name weblogic.jar 查到jar包,通过命令生成文件 …

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式,相当于 html,但优先级比后者高。 在CSS3中,var()函数是一个用于插入CSS自定义属性&#xff…

Vulhub 靶场训练 DC-6解析

一、搭建环境 kali充当攻击机 ip地址是:192.168.200.14 DC-6充当靶机 : IP地址暂时未知 注意:让两台机器的使用同一种网络适配器 二、信息收集 1、探索同网段存活的主机 ①第一种方法 arp-scan -l②第二种方法 netdiscover -i eth0 -…

Python内置函数67个语法、参数和用法详解

要获取Python解释器中所有当前可用的内置函数和变量的完整列表,您可以在Python解释器中使用dir(__builtins__)命令。这将返回一个包含所有内置函数、异常和其他内置对象的列表。 分为10类 数学运算(7): abs 绝对值divmod 商和余数max 最大min最小pow 指数幂round 取整sum 求…

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊,难道我没写过代码么?不扯了,进入正题哈哈…… 安装 一般没有npm的话会报错: 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错,我们执行…

【骑行新纪元】社交风暴来袭,你准备加入骑友圈了吗?

当你的自行车轮轻轻滑过清晨的露水,你是否曾想与志同道合的骑友分享这一刻的喜悦?骑行,这个曾经只是简单运动的代名词,如今正在悄然转变。随着科技的进步和社交平台的发展,骑行不再只是一种健身方式,它还带…

【机器学习】是什么?——讲解

机器学习 机器学习是人工智能(AI)的一个子领域,它提供了系统通过数据学习并改进其性能的能力,而不需要人为进行显式编程,机器学习模型利用大量的数据样本(训练数据)来学习如何识别模式和关系&a…

C-指针-010

1指针 1.1语法: 【基类型*指针变量名】 【int *p&a】1.2语义: 【基类型】:指针变量指向的目标的数据类型 【*】:表示此时定义的变量是一个指针类型的变量 【&a】:一块存放着int类型数据的空间的地址 【*p】…

slot全局属性 <slot>标签</slot> ::slotted()伪元素 笔记240223

slot全局属性 标签 ::slotted()伪元素 MDN HTML全局属性 MDN HTML全局属性 slot MDN HTML <slot>标签元素 MDN CSS ::slotted()为元素 MDN 使用 templates and slots <slot>标签 <slot>标签是的 display 是 contents 在Web开发中&#xff0c;<s…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

照片上多余的人怎么处理?这几种方法让你的照片更完美!

照片怎么去掉多余人像&#xff1f;这是许多摄影爱好者经常遇到的问题。有时候&#xff0c;我们拍摄了一张非常美好的照片&#xff0c;但由于某些原因&#xff0c;照片中出现了不希望出现的人物。这时候&#xff0c;我们该如何处理呢&#xff1f;下面&#xff0c;我将分享几种常…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探&#xff08;端口扫描和IP扫描&#xff09; 2、SCAPY的应用 3、Python攻击脚本&#xff08;SYN半连接…

【More Effective C++】条款22:采用op+=取代op+优势

采用operator实现operator优点&#xff1a; 降低维护成本&#xff0c;只需要维护operator即可&#xff1b;如果operator为publicoperator不需要称为class的友元&#xff1b;通过模板的方式自动实现operator版本&#xff1b;提供两种操作方式&#xff0c;operator效率高&#x…

计算机网络-局域网

文章目录 局域网局域网拓扑结构以太网以太网传输介质以太网时隙提高传统以太网带宽的途径以太网帧格式 局域网协议IEEE 802参考模型IEEE802.2协议LLC帧格式及其控制字段LLC提供的三种服务 IEEE 802.3协议IEEE 802.4协议IEEE 802.5协议 高速局域网100M以太网千兆以太网万兆以太网…

冲突管理最佳实践

任何团队都无法避免冲突&#xff0c;如何有效管理冲突&#xff0c;将冲突转化为团队成长和凝聚的动力&#xff0c;是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…

计算机网络中的与或非运算

三种基本逻辑运算关系 搭建中小公司网络&#xff0c;根据网址计算&#xff0c;用户的人数 需要ip和掩码&#xff0c;确定可分配的ip数 与运算电路为串联电路&#xff0c;的&#xff0c;A,B的组合情况 具体参考三种基本逻辑运算关系

图片参考网站

摄图网-正版高清图片免费下载_商用设计素材图库 (699pic.com) AIGC数字艺术素材图片-数字艺术-数字艺术图片-摄图网 (699pic.com) 花瓣网 - 陪你做生活的设计师&#xff08;创意灵感天堂&#xff0c;搜索、发现设计灵感、设计素材&#xff09; (huaban.com) 千图网-免费在线…

python视频流处理工具

在当今数字化的时代&#xff0c;视频处理应用变得越来越普遍。无论是视频流分析、实时视频处理还是视频流转码&#xff0c;都需要强大的工具来实现。Python Vidgear 库就是这样一个工具&#xff0c;它为开发人员提供了丰富的功能&#xff0c;用于处理实时视频流。本文将深入探讨…