FreeRTOS创建第一个程序

使用freeRTOS创建任务时使用如下函数

 函数的参数

 创建一个FreeRTOS任务点亮led灯实现led灯500毫秒翻转一次

具体的代码实现

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "freeRTOS.h"
#include "task.h"void Led_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   // 开启RCC外设时钟控制GPIO_InitTypeDef GPIO_InitStructure;                   // 结构体初始化GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       // 使用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // 开启GPIOA_Pin_1 引脚和GPIOA_Pin_0引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // 时钟的频率为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure);                 // 初始化时钟的结构体           	  GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);        // 设置引脚的默认电平为低电平
}void Led0_ON(void){GPIO_SetBits(GPIOA, GPIO_Pin_0);  // 引脚的电平为高电平
}void Led0_OFF(void){GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 引脚的电平为低电平
}void Led1_ON(void){GPIO_SetBits(GPIOA, GPIO_Pin_1);
}void Led1_OFF(void){GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}void LED_Turn0(void){ // led0电平翻转if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_0);	}else{GPIO_ResetBits(GPIOA, GPIO_Pin_0);}}void LED_Turn1(void){  // led1电平翻转// 读取用输出寄存器中的某一位if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);	}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}}
// 创建FreeRTOS的句柄
TaskHandle_t Handle_task1;void Task1Function(void * pram){ while(1){LED_Turn0();vTaskDelay(500);Led0_OFF();vTaskDelay(500);	LED_Turn1();vTaskDelay(500);Led1_OFF();vTaskDelay(500);}
}int main(void){Led_Init();// 创建FreeRTOS的任务函数xTaskCreate(Task1Function,"task1",128,NULL,1,&Handle_task1);vTaskStartScheduler();while(1){}}

debug查看输出的pwm波形验证该测试时是成功的,开发板有反馈

 

注:基础知识部分参考学习自韦东山老师学习文档

串口实现程序创建并查看返回结果

void Task1Function(void * pram){while(1){printf("1");}
}
void Task2Function(void * pram){while(1){printf("2");}
}int main( void )
{TaskHandle_t xHandleTask1;#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

代码只需要编写以上部分即可

#include <stdio.h>/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"/* Library includes. */
#include "stm32f10x_it.h"/* Demo app includes. */
#include "lcd.h"
#include "LCD_Message.h"
#include "BlockQ.h"
#include "death.h"
#include "integer.h"
#include "blocktim.h"
#include "partest.h"
#include "semtest.h"
#include "PollQ.h"
#include "flash.h"
#include "comtest2.h"
#include "serial.h"/* Task priorities. */
#define mainQUEUE_POLL_PRIORITY				( tskIDLE_PRIORITY + 2 )
#define mainCHECK_TASK_PRIORITY				( tskIDLE_PRIORITY + 3 )
#define mainSEM_TEST_PRIORITY				( tskIDLE_PRIORITY + 1 )
#define mainBLOCK_Q_PRIORITY				( tskIDLE_PRIORITY + 2 )
#define mainCREATOR_TASK_PRIORITY           ( tskIDLE_PRIORITY + 3 )
#define mainFLASH_TASK_PRIORITY				( tskIDLE_PRIORITY + 1 )
#define mainCOM_TEST_PRIORITY				( tskIDLE_PRIORITY + 1 )
#define mainINTEGER_TASK_PRIORITY           ( tskIDLE_PRIORITY )/* Constants related to the LCD. */
#define mainMAX_LINE						( 240 )
#define mainROW_INCREMENT					( 24 )
#define mainMAX_COLUMN						( 20 )
#define mainCOLUMN_START					( 319 )
#define mainCOLUMN_INCREMENT 				( 16 )/* The maximum number of message that can be waiting for display at any one
time. */
#define mainLCD_QUEUE_SIZE					( 3 )/* The check task uses the sprintf function so requires a little more stack. */
#define mainCHECK_TASK_STACK_SIZE			( configMINIMAL_STACK_SIZE + 50 )/* Dimensions the buffer into which the jitter time is written. */
#define mainMAX_MSG_LEN						25/* The time between cycles of the 'check' task. */
#define mainCHECK_DELAY						( ( TickType_t ) 5000 / portTICK_PERIOD_MS )/* The number of nano seconds between each processor clock. */
#define mainNS_PER_CLOCK ( ( unsigned long ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) )/* Baud rate used by the comtest tasks. */
#define mainCOM_TEST_BAUD_RATE		( 115200 )/* The LED used by the comtest tasks. See the comtest.c file for more
information. */
#define mainCOM_TEST_LED			( 3 )/*-----------------------------------------------------------*//** Configure the clocks, GPIO and other peripherals as required by the demo.*/
static void prvSetupHardware( void );/** Retargets the C library printf function to the USART.*/
int fputc( int ch, FILE *f );/** Configures the timers and interrupts for the fast interrupt test as* described at the top of this file.*/
extern void vSetupTimerTest( void );/*-----------------------------------------------------------*/void Task1Function(void * pram){while(1){printf("1");}
}
void Task2Function(void * pram){while(1){printf("2");}
}int main( void )
{TaskHandle_t xHandleTask1;#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}
/*-----------------------------------------------------------*//*-----------------------------------------------------------*//*-----------------------------------------------------------*/static void prvSetupHardware( void )
{/* Start with the clocks in their expected state. */RCC_DeInit();/* Enable HSE (high speed external clock). */RCC_HSEConfig( RCC_HSE_ON );/* Wait till HSE is ready. */while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET ){}/* 2 wait states required on the flash. */*( ( unsigned long * ) 0x40022000 ) = 0x02;/* HCLK = SYSCLK */RCC_HCLKConfig( RCC_SYSCLK_Div1 );/* PCLK2 = HCLK */RCC_PCLK2Config( RCC_HCLK_Div1 );/* PCLK1 = HCLK/2 */RCC_PCLK1Config( RCC_HCLK_Div2 );/* PLLCLK = 8MHz * 9 = 72 MHz. */RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 );/* Enable PLL. */RCC_PLLCmd( ENABLE );/* Wait till PLL is ready. */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source. */RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );/* Wait till PLL is used as system clock source. */while( RCC_GetSYSCLKSource() != 0x08 ){}/* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );/* SPI2 Periph clock enable */RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );/* Set the Vector Table base address at 0x08000000 */NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );/* Configure HCLK clock as SysTick clock source. */SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );SerialPortInit();
}
/*-----------------------------------------------------------*//*-----------------------------------------------------------*//*-----------------------------------------------------------*/#ifdef  DEBUG
/* Keep the linker happy. */
void assert_failed( unsigned char* pcFile, unsigned long ulLine )
{for( ;; ){}
}
#endif

串口打印效果如下所示

RTOS的核心就是一个多任务系统,这个多任务系统好像是在多任务执行的,但是实际上是交叉执行的

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

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

相关文章

(三)ffmpeg 解码流程以及函数介绍

一、视频解码流程 二、函数介绍 1.avformat_network_init 函数作用&#xff1a; 执行网络库的全局初始化。这是可选的&#xff0c;不再推荐。 此函数仅用于解决旧GnuTLS或OpenSSL库的线程安全问题。如果libavformat链接到这些库的较新版本&#xff0c;或者不使用它们&#…

阿里云微调chatglm3-6b---只有一个python解释器但gradio要求版本不兼容怎么办

安装LLAMA参考博文http://t.csdnimg.cn/6yYwG 在用LLAMA微调大模型的时候总是出现connected error out并且出现这样的界面 这是由于LLMA所要求的gradio版本>4.0.0,<4.2.0&#xff0c;然而chatglm3-6b要求的gradio版本需要gradio3.39.0才能显示出web_demo_gradio.py渲染…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

Mac环境 llamafile 部署大语言模型LLM

文章目录 Github官网本地部署 llamafile 是一种可在你自己的电脑上运行的可执行大型语言模型&#xff08;LLM&#xff09;&#xff0c;它包含了给定的开放 LLM 的权重&#xff0c;以及运行该模型所需的一切。让人惊喜的是&#xff0c;你无需进行任何安装或配置。 Github https…

爱奇艺APP Android低端机性能优化

01 背景介绍 在智能手机市场上&#xff0c;高端机型经常备受瞩目&#xff0c;但低端机型亦占据了不可忽视的份额。众多厂商为满足低端市场的需求&#xff0c;不断推出低配系列手机。另外过去几年的中高端机型&#xff0c;随着系统硬件的快速迭代&#xff0c;现已经被归类为低端…

APP开发_开发一个入门的 H5 APP

1 开发环境的搭建与准备 1.1 安装 Android Studio 下载&#xff1a;首先&#xff0c;从谷歌的安卓开发者网站&#xff08;https://developer.android.google.cn/studio/releases?hlzh-cn&#xff09;下载Android Studio的安装包。在下载页面中&#xff0c;可以根据自己的操作…

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效&#xff0c;各项基础设施的建设也在迅速发展&#xff0c;其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施&#xff0c;公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

asp.net core 网页接入微信扫码登录

创建微信开放平台账号&#xff0c;然后创建网页应用 获取appid和appsecret 前端使用的vue&#xff0c;安装插件vue-wxlogin 调用代码 <wxlogin :appid"appId" :scope"scope" :redirect_uri"redirect_uri"></wxlogin> <scri…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

Python学习从0到1 day25 第二阶段 SQL ② Python操作数据库

少年有梦&#xff0c;不应至于心动&#xff0c;更要付诸行动 —— 24.4.12 pymysql 除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库 在Python中&#xff0c;使用第三方库&#xff1a;pymysql来完成对MySQl数据库的操作 安装 pip install py…

什么是面向对象思想?

面向对象不是一种技术&#xff0c;而是一种思想。它指导我们以什么形式组织代码&#xff0c;以什么思路解决问题。 面向对象编程&#xff0c;是一种通过对象方式&#xff0c;把现实世界映射到计算机世界的编程方法。 面向对象解决问题的思路&#xff1a;把构成问题的事物分解成…

Go——网络编程

一. 互联网协议介绍 网络基础——网络传输基本流程_网络传输过程-CSDN博客 应用层HTTP协议-CSDN博客 传输层UDP/TCP协议_udp报文提供的确认号用于接收方跟发送方确认-CSDN博客 网络层IP协议-CSDN博客 链路层以太网详解_以太网数据链路层-CSDN博客 二. Socket编程 Socket是…

中国省级人口结构数据集(2002-2022年)

01、数据简介 人口结构数据不仅反映了地域特色&#xff0c;更是预测地区未来发展趋势的重要工具。在这些数据中&#xff0c;总抚养比、少年儿童抚养比和老年人口抚养比是三大核心指标。 少儿抚养比0-14周岁人口数/15-64周岁人口数 老年抚养比65周岁及以上人口数/15-64周岁人…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

03-JAVA设计模式-外观模式

外观模式 什么是外观模式 外观模式&#xff08;Facade Pattern&#xff09;是面向对象设计模式中的一种&#xff0c;它为子系统中的一组接口提供了一个统一的高级接口&#xff0c;使得子系统更容易使用。外观模式定义了一个高层接口&#xff0c;让子系统更容易使用。子系统中…

【JS进阶】第四天

JavaScript 进阶 - 第 4 天 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型&#xff0c;因为简单类型直接拷贝值了 浅拷贝&#xff1a;拷贝的是地址&#xff0c;只拷贝一层 常见方法&#xff1a; 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {…obj} 拷贝对象…

Linux_ubuntu使用常见问题解决

文章目录 1.安装好了搜狗输入法却只能输出英文&#xff1a; 1.安装好了搜狗输入法却只能输出英文&#xff1a; 1.浏览器搜索搜狗输入法&#xff0c;下载好安装包 终端输入下列命令安装&#xff0c;找不到文件可以cd到该安装包的目录文件下&#xff1a; sudo dpkg -i sogoupin…

自定义vue-cli 实现预设模板项目

模板结构 主要包括四个部分&#xff1a; preset.jsonprompts.jsgenerator/index.jstemplate/ 项目最终结构 preset.json preset.json 中是一个包含创建新项目所需预定义选项和插件的 JSON 对象&#xff0c;让用户无需在命令提示中选择它们&#xff0c;简称预设&#xff1b;…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

云计算重要概念之:虚拟机、网卡、交换机、路由器、防火墙

一、虚拟机 (Virtual Machine, VM) 1.主流的虚拟化软件&#xff1a; 虚拟化软件通过在单个物理硬件上创建和管理多个虚拟环境&#xff08;虚拟机&#xff09;&#xff0c;实现资源的高效利用、灵活部署、隔离安全以及便捷管理&#xff0c;是构建云计算和现代化数据中心的核心…