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.mzph.cn/news/804336.shtml

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

相关文章

PMP持证者在面试项目经理时有加持吗?

对PMP认证获取后是否在面试中加持很多人是没有体验过的&#xff0c;因为大部分人考取PMP认证的原因是因为公司的要求&#xff0c;没有这个证书可能面临被“优化”的风险。理论上来说一样的道理&#xff0c;PMP认证既然能够保住工作岗位&#xff0c;那么在面试中一定会有相应的作…

利用AI开源引擎平台:构建文本、图片及视频内容审核系统|可本地部署

网络空间的信息量呈现出爆炸式增长。在这个信息多元化的时代&#xff0c;内容审核系统成为了维护网络秩序、保护用户免受有害信息侵害的重要工具。本文将探讨内容审核系统的核心优势、技术实现以及在不同场景下的应用。 开源项目介绍(可本地部署&#xff0c;支持国产化) 思通数…

12.C++常用的算法_遍历算法

文章目录 遍历算法1. for_each()代码工程运行结果 2. transform()代码工程运行结果 3. find()代码工程运行结果 遍历算法 1. for_each() 有两种方式&#xff1a; 1.普通函数 2.仿函数 代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vect…

layui复选框勾选取消勾选事件监听

监听事件放置位置&#xff1a; form.on(checkbox(equipInputClick), function(data){var a data.elem.checked;var val data.value;if(a true){}else{}});html部分 <input lay-filter"equipInputClick" type"checkbox" lay-skin"primary&quo…

前端做了快两年了,盘点一下我的前端技术栈

前言 前言很简单&#xff0c;年终了&#xff0c;自己写了快两年前端&#xff08;虽然刚毕业&#xff09;&#xff0c;但是大致总结一下哈哈哈哈 我觉得这个话题蛮有意思的&#xff0c;可以看看大家的技术广度&#xff0c;可以进行分享和学习以及讨论 所以这里说一下我对我的…

# ABAP SQL 字符串处理

经常我都要在ABAP的sql语句中对字符串进行处理&#xff0c;现在就总结一下可以用到的方法 文章目录 字符串处理拼接字段运行结果 填充字符串运行结果 截取字符串 SUBSTRING运行结果 CAST转换类型程序运行结果 字符串处理 在SQL语句中&#xff0c;有时候会有需要拼接字段或者是…

车载平板电脑丨车载终端丨浅聊叉车仓储出入库管理解决方案

众所周知&#xff0c;叉车是制造业自动化升级的核心设备。 十三五期间&#xff0c;提出中国制造 2025 战略&#xff0c;其核心内容就是要用机器代替人工&#xff0c;提升生产效率&#xff0c;降低对劳动力的依赖性。而叉车作为起重、搬运等普通劳动力替代的核心设备&#xff0…

C++解决大学课设所有管理系统(增删查改)

C一篇解决大学课设所有**管理系统(增删查改) 文章目录 C一篇解决大学课设所有**管理系统(增删查改)1.引言1.1 使用结果展示 2. 基本原理3. 文件层次结构4.具体实现(通讯录管理系统为例)4.1 通讯录实体类(addressbook.h)4.2 通讯录实现类(addressbook.cpp)4.3 通讯录管理类&…

设备树的概念及引入、设备树如何变成device

在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离&#xff0c;但每次调整资源还是会涉及到内核&#xff0c;所以现在更加流行的是设备树方式。设备树的好处是通过独立于内核存在&#xff0c;这样如果设备上外设功能启用与否以及位置变动的话很多时候不用修改…

【股权激励】“三级股权分配法”——某互联网电商企业股权激励管理

【客户背景及面临难题】K公司于2014年上线&#xff0c;是由多位创始人联合创办的一家以众包微物流配送为核心模式&#xff0c;主营同城水果、蔬菜、生鲜、日常生活用品、零食等商品在线销售&#xff0c;专注于社区生鲜最后一公里配送&#xff0c;主打一小时之内闪电送达的互联网…

使用C语言函数对数组进行操作

前言 在我们了解数组和函数之后&#xff0c;我们对数组和函数进行结合&#xff0c;之后完成一些操作吧 题目描述 杰克想将函数与数组结合进行一些操作&#xff0c;以下是他想要达到的效果&#xff0c;请你帮帮他吧&#xff01; 创建一个整型数组&#xff0c;完成对数组的操作 1…

签约速递 | 看零信任如何打造安全互联的数字底座?

近期&#xff0c;易安联再传佳音&#xff0c;签约南通市公安局、隆基绿能科技股份有限公司、南京体育学院等&#xff0c;持续为客户提供功能更完善、体验更好的零信任安全解决方案&#xff0c;赋能千行百业数字化转型升级&#xff0c;共创网络安全繁荣生态。 南通市公安局 数字…

K-means聚类算法的原理、应用与实例

文章目录 K-means 聚类算法&#xff1a;原理K-means 聚类算法的应用K-means 聚类算法的优化与改进 一个使用 K-means 聚类算法进行客户细分的简单实例 K-means 聚类算法&#xff1a;原理 K-means 算法是一种经典的无监督学习方法&#xff0c;用于对未标记的数据集进行分群&…

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

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

macOS 启动 Nacos(2),50家大厂面试万字精华总结

进来之后一定要选择支持 arm64 的版本不然会出现因为版本不支持导致无法启动 WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested点击 copy docker pull nacos/naco…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.4 库存超卖问题及其解决4.3.4.1 问题分析4.3.4.2 问题解决 4.3.5 一人一单需求4.3.5.1 需求分析4.3.5.2 代码实现4.3.5.3 并发问题4.3.5.4 悲观锁解决并发问题4.3.5.5 集群环境下的并发问题 4.4 …

最新版手机软件App下载排行网站源码/App应用商店源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 一款简洁蓝色的手机软件应用app下载排行&#xff0c;app下载平台&#xff0c;最新手机app发布网站响应式织梦模板。 主要有&#xff1a;主页、app列表页、app介绍详情页、新闻资讯列…

Linux中磁盘的分区,格式化,挂载和文件系统的修复

一.分区工具 1.分区工具介绍 fdisk 2t及以下分区 推荐 (分完区不保存不生效&#xff0c;有反悔的可能) gdisk 全支持 推荐 parted 全支持 不推荐 ( 即时生效&#xff0c;分完立即生效) 2.fdisk 分区,查看磁盘 格式:fdisk -l [磁盘设备] fdisk -l 查看…

网络协议——RSTP(快速生成树)与MSTP(多实例生成树)

一. RSTP 1. STP的不足 1、依靠计时器超时的方式进行收敛导致它的收敛时间需要30到50秒 2、端口状态和端口角色没有细致区分&#xff0c;指导数据转发依靠的不是端口状态而是端口所扮演角色。 3、如果拓扑频繁变化导致用户通信质量差&#xff0c;甚至通信中断&#xf…