三、从官方源码精简出第1个FreeRTOS

news2024/9/23 3:26:57

1、官方源码下载

(1)进入FreeRTOS官网:FreeRTOS官网

(2)点击下载FreeRTOS。

(3)选择待示例的项目进行下载。

2、删减目录

(1)下载后解压的FreeRTOS文件如下图所示。

(2)删除下图中红框勾选的文件。

(3)删除"FreeRTOSv202212.01\FreeRTOS\Demo"目录下用不到的示例工程。

(4)删除“FreeRTOS-Plus”整个文件,FreeRTOS的生态文件,非比需的。

 (5)删除“tools”整个文件,这里面是亚马逊相关的文件,我们也不需要。

 (6)"FreeRTOSv202212.01\FreeRTOS\Source\portable"目录下只保留如下两个文件夹,其他全部删掉。

(7)"FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS"目录下只保留如下一个文件夹,其他全部删掉。

(8)删除后文件后,部分文件目录如下。(由目录树生成工具zDirTree生成)。、

E:\RTOS\官方源码\FreeRTOSv202212.01
├FreeRTOS
│  ├Demo                       // 预先制作好的示例工程
│  │  ├CORTEX_STM32F103_Keil   // STM32F103在keil环境下的工程文件
│  │  │  ├FreeRTOSConfig.h
│  │  │  ├...
│  ├License
│  ├Source
│  │  ├croutine.c       // 核心文件
│  │  ├event_groups.c   // 核心文件
│  │  ├list.c           // 核心文件
│  │  ├queue.c          // 核心文件
│  │  ├stream_buffer.c  // 核心文件
│  │  ├tasks.c          // 核心文件
│  │  ├timers.c         // 核心文件
│  │  ├include
│  │  ├portable         // 移植时需要实现的文件
│  │  │  ├MemMang       // 内存管理
│  │  │  │  ├heap_1.c
│  │  │  │  ├heap_2.c
│  │  │  │  ├heap_3.c
│  │  │  │  ├heap_4.c
│  │  │  │  ├heap_5.c
│  │  │  │  ├ReadMe.url
│  │  │  ├RVDS          // IDE为RVD或keil
│  │  │  │  ├ARM_CM3    // CortexM3架构
│  │  │  │  │  ├port.c
│  │  │  │  │  ├portmacro.h
│  ├Test

3、编译

3.1、首次编译

(1)打开工程。

(2)弹出如下对话框,说明该工程是用KeilMDK4创建的。点击“Migrate to Device Pack”更新为KeilMDK5。

(3)弹出对话框,点击“确定”。

(4)更新后,关闭工程再重新打开。编译情况如下。

(5)编译后报错106,明显不正常。该程序原本是Keil4MDK中编写的,更新为KeilMDK5出现的问题。

3.2、IDE更新后程序报错

(1)KeilMDK4中使用的编译器是"Missing: Compiler Version 5",而KeilMDK5中该编译器默认是不安装的。解决思路就是安装该编译器在编译试试。(ARM Comliler是ARM编译器的意思)

(2)V5编译器的下载,参考链接。

  • 我使用阿里云盘无法创建分享链接
  • 可以从安装了KeilMDK4的电脑上找,查找路径后下文安装路径相同
  • 网上搜索查找下载

(3)将下载“ARMCC文件”拷贝至Keil安装路径下的“ARM”文件夹中。

(4)打开一个Keil工程,点击如下图标。

(5)点击“Folders/Extensions”,在点击“...”,出现右侧弹窗。

(6)点击“Add another...”,找到我们Keil安装路径下的ARMCC文件,点击“确定”。

(7)出现如下图所示V5编译器,点击一下红框,在点“Close”,至此ARMV5编译器安装完成。

(8)选择V5编译器,再次编译项目,编译结果如下。

3.3、Common目录错误解决

(1)根据上图,说明Common目录不能删除。Common目录下是独立与demo的通用代码,大部分已经弃用。

(2)重新把它添加回去。

(3)添加后如下。

(4)重新编译。

4、添加串口打印功能

4.1、去掉无关代码

(1)去掉LCD代码。

(2)Demo Files文件下只保留“serial.c和main.c”文件,其他都删掉。

(3)编译

4.2、删除未定义报错内容

(1)在文件STM32F10x.s中,删除如下内容。

(2)删除其他未定义的相关内容,再次编译。

(3)报错的内容均删除或者注释,直到没错为止。

4.2、增加串口打印功能。

4.2.1、初始化串口。

(1)修改serial.c文件中的xSerialPortInitMinimal函数,删除其余用不到的内容。

(2)修改后serial.c文件。

/*
 * FreeRTOS V202212.01
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

/*
	BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
*/

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "queue.h"
#include "semphr.h"

/* Library includes. */
#include "stm32f10x_lib.h"

/* Demo application includes. */
#include "serial.h"
/*-----------------------------------------------------------*/

/*
 * See the serial2.h header file.
 * 功能:串口初始化
 * 注:
 * 	 波特率:115200
 */
void SerialPortInit(void)
{
	USART_InitTypeDef USART_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;


		/* Enable USART1 clock */
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );

		/* Configure USART1 Rx (PA10) as input floating */
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_Init( GPIOA, &GPIO_InitStructure );

		/* Configure USART1 Tx (PA9) as alternate function push-pull */
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_Init( GPIOA, &GPIO_InitStructure );

		USART_InitStructure.USART_BaudRate = 115200;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_Parity = USART_Parity_No ;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
		USART_InitStructure.USART_Clock = USART_Clock_Disable;
		USART_InitStructure.USART_CPOL = USART_CPOL_Low;
		USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
		USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

		USART_Init( USART1, &USART_InitStructure );

		USART_ITConfig( USART1, USART_IT_RXNE, ENABLE );

		

		USART_Cmd( USART1, ENABLE );
}
/*-----------------------------------------------------------*/

(3)修改后serial.h文件。

/*
 * FreeRTOS V202212.01
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

#ifndef SERIAL_COMMS_H
#define SERIAL_COMMS_H

typedef void * xComPortHandle;

typedef enum
{
    serCOM1,
    serCOM2,
    serCOM3,
    serCOM4,
    serCOM5,
    serCOM6,
    serCOM7,
    serCOM8
} eCOMPort;

typedef enum
{
    serNO_PARITY,
    serODD_PARITY,
    serEVEN_PARITY,
    serMARK_PARITY,
    serSPACE_PARITY
} eParity;

typedef enum
{
    serSTOP_1,
    serSTOP_2
} eStopBits;

typedef enum
{
    serBITS_5,
    serBITS_6,
    serBITS_7,
    serBITS_8
} eDataBits;

typedef enum
{
    ser50,
    ser75,
    ser110,
    ser134,
    ser150,
    ser200,
    ser300,
    ser600,
    ser1200,
    ser1800,
    ser2400,
    ser4800,
    ser9600,
    ser19200,
    ser38400,
    ser57600,
    ser115200
} eBaud;

void SerialPortInit(void);    


#endif /* ifndef SERIAL_COMMS_H */

(4)修改后编译。报未定义vUARTInterruptHandler。

  • 找到vUARTInterruptHandler,注释掉相关内容。
  • 在STM32F10x.s文件中
  • DCD     0;vUARTInterruptHandler     ; USART1
  • ;IMPORT vUARTInterruptHandler

(5)修改后编译。

4.2.2、实现fputc。

(1)fputc函数移动到serial.c文件中。

int fputc( int ch, FILE *f )
{
	USART_TypeDef *USARTx = USART1;
	while( (USARTx->SR & (1<<7)) == 0);  // 等待上次的数据发送完成
	USARTx->DR = ch;
	return ch;
}

(2)串口初始化函数SerialPortInit在函数prvSetupHardware中调用;prvSetupHardware函数在main中调用。

(3)在main.c使用printf打印"Hello World.\r\n"

5、实验现象和程序下载

5.1、使用Keil模拟器查看实验现象

5.2、修改后完整工程下载地址

(1)完整工程存储在码云。

(2)FreeRTOS_CSDN: 用来保存FreeRTOS学习使用中用到的程序

 

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

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

相关文章

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力&#xff1a;下一波生产力浪潮》中指出&#xff0c;生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中&#xff0c;「生成式AI」…

ubuntu22安装如何安装window软件(.exe)

ubuntu未提供相应程序安装包&#xff0c;如何使用的ubuntu22.04 安装window提供的exe程序呢&#xff1f; 这里我了解有两种方案&#xff1a; 使用模拟器进行window程序的运行&#xff0c;但是肯定会有相应的性能损耗如&#xff08;wine&#xff09;在linux上运行virtualbox或…

Michael.W基于Foundry精读Openzeppelin第20期——EnumerableMap.sol

0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#xff1a;v1.5.6 0.1 EnumerableMap.sol Github: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.3/contracts/utils/structs/EnumerableMap.sol EnumerableMap库提供了Bytes32ToB…

【Linux系统编程】冯诺依曼体系结构

目录 前言 什么是冯诺依曼体系结构&#xff1f; 冯诺依曼体系结构如何进行数据处理的&#xff1f; 存储器在冯诺依曼体系中有什么作用&#xff1f; 冯诺依曼体系结构为什么要这样设计&#xff1f; 冯诺依曼结构总结 前言 相信对于冯诺依曼这个人的名字大家一定不会感到陌…

[RT-Thread]基于ART-PI的YMODEM协议在文件系统(LFS,FAT,RAMFS)下的文件传输及其注意事项

[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 前提 准备工作 内容 问题也就是注意事项 前提 准备工作 创建基于ART-PI开发板(STM32H750)…

Kernel Exception导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、高温触发 Kernel Exception 重启问题二、解决方案三、提高电池温度方案 一、 高温触发 Kernel Exception 重启问题 手机 电池温度 默认60度以上高温…

网页版Java(Spring/Spring Boot/Spring MVC)五子棋项目(二)前后端实现用户的登录和注册功能【用户模块】

网页版Java五子棋项目&#xff08;二&#xff09;前后端实现用户的登录和注册功能【用户模块】 在用户模块我们要清楚要完成的任务一、MyBatis后端操作数据库1. 需要在数据库创建用户数据库1. 用户id2. 用户名3. 密码4. 天梯积分5. 总场数6. 获胜场数 2. 创建用户类User和数据库…

网络开发-IO模型

基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 用户进程空间<-->内核空间内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络I/O和磁盘…

python机器学习(六)决策树(上) 构造树、信息熵的分类和度量、信息增益、CART算法、剪枝

决策树算法 模拟相亲的过程&#xff0c;通过相亲决策图&#xff0c;男的去相亲&#xff0c;会先选择性别为女的&#xff0c;然后依次根据年龄、长相、收入、职业等信息对相亲的另一方有所了解。 通过决策图可以发现&#xff0c;生活中面临各种各样的选择&#xff0c;基于我们的…

考研408 | 【计算机网络】物理层

导图&#xff1a; 一、通信基础 基本概念&#xff1a; 物理层接口特性&#xff1a;物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务&#xff1a;确定与传输媒体接口有关的一些特性 典型的数据通信模型 数据通…

SAP-MM-发票校验的重复校验功能

路径&#xff1a;SPRO-物料管理-后勤发票校验-收入发票-设置重复发票检查 按公司代码设置重复检查&#xff0c;可以按三个方式进行检查&#xff0c;公司代码、参照、发票日期&#xff0c;如果此处未维护就是按供应商&#xff08;XK02&#xff09;的六项进行检查 但是如果两处都…

latex插入不连续的中线

在上面的示例中&#xff0c;\cmidrule(lr){1-3} 表示在第 1 列到第 3 列之间添加不连续的中线&#xff0c;\cmidrule(lr){4-6} 表示在第 4 列到第 6 列之间添加不连续的中线&#xff0c;以此类推。你可以根据需要调整列的范围和对齐方式。

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值&#xff0c;选择较小的节点作为合并后的链…

Java8 文件工具类 FileUtils(持续更新中)

1. Java8 文件处理 使用 Java8 的 java.nio.file 方法&#xff0c;来进行文件处理。 1.1. 读文件 所有内容一次读出来&#xff0c;结果为字符串。 1.1.1. 代码 /*** 读取文件** param path 文件路径* return 文件内容&#xff08;字符串&#xff09;*/public static String…

Python导出SqlServerl数据字典为excel

sql代码 SELECTtableName D.name ,tableIntroduce isnull(F.value, ),sort A.colorder,fieldName A.name,catogary B.name,bytes A.Length,lengths COLUMNPROPERTY(A.id, A.name, PRECISION),scales isnull(COLUMNPROPERTY(A.id, A.name, Scale), 0),isOrNotNull Cas…

差值结构的相互作用能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A&#xff0c;B中各有3个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 其中有10组数据 差值结构 A-B 迭代次数 构造平均列 平均列…

2.4G芯片G350开发的遥控玩具解决方案

玩具从早期的简单功能&#xff0c;到现如今各种各样的智能操作&#xff0c;发展的速度也是飞速的。随着玩具市场的逐步完善与推进&#xff0c;中国的智能玩具市场也出现了很多远程遥控玩具。遥控玩具也是从最初的有线到现在的无线&#xff0c;从地上跑的到天上飞的&#xff0c;…

vue2-常用的修饰符有哪些应用场景?

1、修饰符是什么&#xff1f; 在程序的世界里&#xff0c;修饰符是用于限定类型以及类型成员的声明的一种 符号。 在vue中&#xff0c;修饰符处理了许多DOM事件的细节&#xff0c;让我们不再需要花大量的时间去处理这些重复的事情&#xff0c;而能有更多的精力专注于程序的逻辑…

安全作业-Race竞争型漏洞、原型链污染

1.race漏洞一直卡在虚拟机安装上(待研究) 2.原型链污染 一、第一题js代码 const express require(express) var hbs require(hbs); var bodyParser require(body-parser); const md5 require(md5); var morganBody require(morgan-body); const app express(); var use…