用freertos写个闪烁小灯的程序
时间: 2023-06-30 16:09:34 浏览: 161
好的,以下是一个简单的使用FreeRTOS的闪烁小灯程序。
```c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define BLINK_GPIO 2
void blink_task(void *pvParameter)
{
gpio_pad_select_gpio(BLINK_GPIO);
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
while (1) {
gpio_set_level(BLINK_GPIO, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(BLINK_GPIO, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main()
{
xTaskCreate(&blink_task, "blink_task", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
}
```
这个程序将GPIO 2配置为输出,并在循环中交替设置和清除它的值。任务的优先级为5,非常低。
要运行此程序,请将其复制到ESP32开发板上的main.c文件中,并使用ESP-IDF构建和烧录它。在GPIO 2处插入LED,并观察它的闪烁。
相关问题
写FreeRTOS+按键控制LED闪烁程序
非常好的问题!以下是一个简单的 FreeRTOS 按键控制 LED 闪烁的程序示例:
```c
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx.h"
#define LED_PIN GPIO_Pin_12
#define KEY_PIN GPIO_Pin_0
void GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = KEY_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void vLED_task(void *pvParameters)
{
while (1)
{
GPIO_SetBits(GPIOA, LED_PIN);
vTaskDelay(500);
GPIO_ResetBits(GPIOA, LED_PIN);
vTaskDelay(500);
}
}
void vBUTTON_task(void *pvParameters)
{
while (1)
{
if (GPIO_ReadInputDataBit(GPIOA, KEY_PIN) == Bit_SET)
{
xTaskNotifyGive(NULL);
}
vTaskDelay(50);
}
}
void vLED_control_task(void *pvParameters)
{
uint32_t ulNotificationValue;
while (1)
{
xTaskNotifyWait(0x00, ULONG_MAX, &ulNotificationValue, portMAX_DELAY);
if (ulNotificationValue == 1)
{
GPIO_ToggleBits(GPIOA, LED_PIN);
}
}
}
int main()
{
GPIO_Init();
xTaskCreate(vLED_task, "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(vBUTTON_task, "BUTTON", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
xTaskCreate(vLED_control_task, "LED_CONTROL", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL);
vTaskStartScheduler();
while (1);
}
```
该程序使用了 FreeRTOS 的三个任务,其中:
- `vLED_task` 负责控制 LED 的闪烁;
- `vBUTTON_task` 负责监听按键,并且通过发送通知告诉其他任务有按键按下;
- `vLED_control_task` 在接收到按键通知后,控制 LED 的开和关。
在主函数中,我们首先初始化了 GPIO,并且使用 `xTaskCreate` 创建了以上三个任务。其中,`vTaskStartScheduler` 会启动任务调度器,程序会进入循环等待,这时候任务调度器会不断地调度各个任务执行。
希望这个例子可以帮助你更好地了解 FreeRTOS!
写一个freeRTOS系统的简单程序
我可以给你一个简单的FreeRTOS系统程序的示例:#include <stdlib.h>
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"void vTask1( void *pvParameters )
{
for (;;) {
printf("执行任务1\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}void vTask2( void *pvParameters )
{
for (;;) {
printf("执行任务2\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}int main( void )
{
xTaskCreate(vTask1,"任务1",configMINIMAL_STACK_SIZE,NULL,1,NULL);
xTaskCreate(vTask2,"任务2",configMINIMAL_STACK_SIZE,NULL,1,NULL);
vTaskStartScheduler();
return 0 ;
}
阅读全文