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.hqwc.cn/news/617107.html

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

相关文章

linux进阶篇:性能分析工具: iostat命令详细讲解

Linux 性能分析工具&#xff1a; iostat命令详细讲解 Linux系统出现了性能问题&#xff0c;一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。在一个以前看到系统监控工具&#xff0c;总在想那些监控工具的代理&#xff0c;如何收集系统性能信息&#xff0…

GitHub repository - Pulse - Contributors - Network

GitHub repository - Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津&#xff0c;还是在火热地开发之中&#xff0c;从这里可以一目了然。 2. Contributors 显示对该仓库进行过…

c语言中声明的问题【求个关注!】

文章目录 1 变量的声明与定义&#xff08;1&#xff09;定义与声明的区别&#xff1a;&#xff08;2&#xff09;为什么要区分定义与声明&#xff1f;&#xff08;3&#xff09;extern是什么 ?&#xff08;4&#xff09;举例&#xff1a; 2 函数的声明&#xff1a;函数声明的格…

Springboot整合nacos报错无法连接nacos

报错信息&#xff1a;Nacos com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING 关于这个报错的原因有很多&#xff1a;如Nacos未启动、网络问题、配置问题、版本不兼容问题等&#xff0c;我的报错原因主要是版本不兼容。 下面…

GPT演变:从GPT到ChatGPT

Transformer 论文 Attention Is All You Need The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder… https://arxiv.o…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中&#xff0c;我们将继续学习字符串函数&#xff0c;准备好了吗&#xff1f;开始咯&#xff01; 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数&#xff0c;它用于将一个字符串的一部分内容…

[lesson27]二阶构造模式

二阶构造模式 构造函数的回顾 关于构造函数 类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在对象定义时自动被调用 你该知道的真相 构造函数 只提供自动初始化成员变量的机会不能保证初始化逻辑一定成功执行return语句后构造函数立即结束 构造函数…

学浪已购买视频怎么下载到本地?

许多学习者在学浪购买了丰富的课程&#xff0c;然而&#xff0c;一些课程存在时间限制&#xff0c;使得学习者希望将其下载并永久保存。在这里&#xff0c;我们将介绍一款名为小浪助手的工具&#xff0c;它能够帮助你轻松将学浪已购买的视频下载到本地&#xff0c;让学习变得更…

Python匿名函数4不要

当你需要完成一件小工作时&#xff0c;在本地环境中使用这个函数&#xff0c;可以让工作如此得心应手&#xff0c;它就是Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas&#xff0c;它们的语法如下&#xff1a; lambda arguments: expressionl…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义&#xff0c;可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步&#xff0c;显著提升了各种任务的完成度。然而&#xff0c;其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数&#xff0c;需要…