IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRTOS在TM4C单片机上的移植:闪烁LED灯 -> 正文阅读

[嵌入式]FreeRTOS在TM4C单片机上的移植:闪烁LED灯

准备工作

在上一篇文章里, 我们已经通过空白工程配置好了系统框架. 这一篇文章我们将在框架的基础上实现Blinky即LED灯闪烁实验
FreeRTOS在Keil里的简单配置, 可以参考这一篇文章: 使用Keil内置工具一键为工程安装FreeRTOS

注意事项

  • 在本例程中, 没有用到软件定时器, 所以我们在配置工程时, 不要选择Timers选项, 可如图配置:
    在这里插入图片描述
    将FreeRTOSConfig.h中configUSE_TIMERS参数设为0, 避免任务无法正常运行的情况.
  • 为了正常运行程序, 空白工程需包含串行输出的初始化, 在TM4C单片机中, 特别的, 是UART0.

亮灯原理

系统运行了两个任务, 分别是Task1和Task2, 其中, Task1执行时间为1000个机器周期, 而Task2为100个. Task1中, 始终执行亮灯语句, 即

GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1);
printf("task1 working\n");
vTaskDelay(1000);

而Task2为:

GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0);
printf("task2 working\n");
vTaskDelay(100);

将Task1的任务优先级设置成高于Task2的任务优先级. 由于Task1执行时间为Task2的10倍, 故在10份时间内, 将会有1份时间执行优先级高的Task1的命令即亮灯, 而其余时间LED灯则会被Task2控制熄灭.
其实如果将两者优先级设置成一样的, 也能够观察到相同时间间隔的亮灯现象, 说明在同优先级下, 先声明的函数具有更高的支配权?(还没研究明白FreeRTOS的任务调度机制)

代码

#include "tiva_sys.h"
#include "freeRTOS.h"
#include "task.h"
int fputc(int ch, FILE *f)
{
	UARTCharPut(UART0_BASE, ch);
	return (ch);
} //重新映射printf函数
int fgetc(FILE *f)
{
	int ch = UARTCharGet(UART0_BASE);
	return (ch);
}
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define TASK1_TASK_PRIO 2
//任务堆栈大小
#define TASK1_STK_SIZE 128
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);

//任务优先级
#define TASK2_TASK_PRIO 3
//任务堆栈大小
#define TASK2_STK_SIZE 128
//任务堆栈
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);

void ConfigureUART0(void) //串口0初始化
{
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); //使能GPIO外设
	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //使能UART外设
	GPIOPinConfigure(GPIO_PA0_U0RX);			 // GPIO模式配置 PA0--RX PA1--TX
	GPIOPinConfigure(GPIO_PA1_U0TX);
	GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // GPIO的UART模式配置
	UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
	UARTStdioConfig(0, 115200, 16000000);
	// UART协议配置 波特率115200 8位 1停止位  无校验位
	printf("Init uart0");
}

int main(void)
{
	SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
				   SYSCTL_XTAL_16MHZ); //设置系统时钟为80MHz
	Led_init();
	ConfigureUART0();
	xTaskCreate((TaskFunction_t)start_task,		 //任务函数
				(const char *)"start_task",		 //任务名称
				(uint16_t)START_STK_SIZE,		 //任务堆栈大小
				(void *)NULL,					 //传递给任务函数的参数
				(UBaseType_t)START_TASK_PRIO,	 //任务优先级
				(TaskHandle_t *)StartTaskStack); //任务堆栈
	vTaskStartScheduler();						 //开启任务调度
}
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL(); //进入临界区
	//创建 TASK1 任务
	xTaskCreate((TaskFunction_t)task1_task,
				(const char *)"task1_task",
				(uint16_t)TASK1_STK_SIZE,
				(void *)NULL,
				(UBaseType_t)TASK1_TASK_PRIO,
				(TaskHandle_t *)&Task1Task_Handler);
	//创建 TASK2 任务
	xTaskCreate((TaskFunction_t)task2_task,
				(const char *)"task2_task",
				(uint16_t)TASK2_STK_SIZE,
				(void *)NULL,
				(UBaseType_t)TASK2_TASK_PRIO,
				(TaskHandle_t *)&Task2Task_Handler);
	vTaskDelete(StartTask_Handler); //删除开始任务 (2)
	taskEXIT_CRITICAL();			//退出临界区
}
void task1_task(void *pvParameters)
{
	while (1)
	{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);
		printf("task1 working\n");
		vTaskDelay(100);
	}
}

void task2_task(void *pvParameters)
{
	while (1)
	{
		GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
		printf("task2 working\n");
		vTaskDelay(1000);
	}
}

工程文件在此
FreeRTOS_Blinky

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:53:52  更:2022-05-09 12:55:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:46:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码