基于江科大代码的stm32f103c8t6的FreeRtos的任务创建与删除(标准库编写)

主代码

void Key_Init(void);


#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );

/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );

/* TASK3 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK3_PRIO         4
#define TASK3_STACK_SIZE   128
TaskHandle_t    task3_handler;
void task3( void * pvParameters );



int main(void)
{
	LED_Init();
	delay_init();
	Key_Init();
	uart_init(115200);
	
	
    xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",
                (uint16_t               )   START_TASK_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,
                (TaskHandle_t *         )   &start_task_handler );
    vTaskStartScheduler();          //开启任务调度

}

void start_task(void *pvParameters)
{
taskENTER_CRITICAL();               /* 进入临界区 */
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (uint16_t               )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (uint16_t               )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                
    xTaskCreate((TaskFunction_t         )   task3,
                (char *                 )   "task3",
                (uint16_t               )   TASK3_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK3_PRIO,
                (TaskHandle_t *         )   &task3_handler );
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
	
}
void task1(void *pvParameters)
{
	while(1)
	{
		printf("task1运行\r\n");
		LED1_ON();                             //开启LED1
		vTaskDelay(500);
		LED1_OFF();                           //关闭LED1
		vTaskDelay(500);
		
	}
	
}
void task2(void *pvParameters)
{
		while(1)
	{
		printf("task2运行\r\n");
		LED2_ON();                           //开启LED2
		vTaskDelay(500);
		LED2_OFF();                          //关闭LED2
		vTaskDelay(500);
		
	}
}

void task3(void *pvParameters)
{

	while(1)
	{			printf("task3运行\r\n");
		

		if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		vTaskDelay(20);                   //去抖
   while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		printf("删除task1\r\n");          //删除任务1
		vTaskDelete(task1_handler);
	}
			if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		vTaskDelay(20);                    //去抖
   while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		printf("删除task2\r\n");          //删除任务2
		vTaskDelete(task2_handler);
	}
	
		

			vTaskDelay(10);

	}
	
}

按钮初始化


//将PB1    PB11做为按钮
void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

LED初始化

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void)    //开启1
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)    //关闭1
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)    //翻转
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)        //开启2
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)       //关闭2
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)      //翻转
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

在观看原子或者其他视频的freertos的代码移植的时候,要注意移植后,编译出现硬件错误的话,可能得考虑FreeRTOSConfig.h 中的系统总的堆栈空间configTOTAL_HEAP_SIZE,将他调小可能解决此问题

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的微型控制器,而FreeRTOS则是一种开源的实时操作系统。STM32F103C8T6FreeRTOS的结合能够实现更加复杂的控制任务,例如高速数据传输和复杂的算法处理。 在STM32F103C8T6上运行FreeRTOS项目时,首先需要选择一个适合的开发板和调试器。然后,在安装好开发环境之后,可以开始编写FreeRTOS项目代码。在FreeRTOS中,主要任务被划分成小的子任务,这些子任务被优先级编排,以保证系统稳定性。此外,FreeRTOS还具有内存保护和错误检测等安全特性,可以有效避免因软件故障导致的控制系统出错。 要实现FreeRTOS项目,需要对多线程编程和RTOS的原理有充分的理解。此外,在STM32F103C8T6中,由于板载内存和CPU资源较少,需要相应地调整任务执行时间和资源占用,以优化系统的性能和稳定性。 总之,STM32F103C8T6FreeRTOS的结合可以实现更加高效、精确、带有各种安全保护的控制系统。因此,STM32F103C8T6上的FreeRTOS项目对于需要高性能和可靠性的复杂控制任务来说是一种优秀的解决方案。 ### 回答2: stm32f103c8t6是一款常用的低功耗、高性能的微控制器芯片,善于处理复杂的应用程序,适用于数控机床、汽车电控、医疗设备、航空航天和通讯网络等领域。 对于stm32f103c8t6 freertos项目,它运用了RTOS的实时操作系统,根据任务优先级划分线程并执行,大大提高了系统的实时响应能力。在项目开发中,我们需要熟悉stm32f103c8t6的硬件特点和正确定义任务及其优先级,才能实现稳定高效的多任务处理。 同时,我们可以利用固件库和中间件实现强大的系统调试能力和低功耗模式下高精度的时钟管理。在应用程序开发中,我们需遵循开发板的外设宏定义和寄存器配置,结合外设驱动程序完成所需任务。 总之,stm32f103c8t6 freertos项目具有广泛的应用空间,需要结合硬件和软件特点综合考虑优化,以实现高效可靠的系统。 ### 回答3: stm32f103c8t6是一款基于ARM Cortex-M3内核的微控制器。在此微控制器上使用FreeRTOS(一个开源的实时操作系统)可以实现多任务、优先级调度、任务管理和同步等功能。以下是一些可能涉及的内容: 1. 硬件配置:需要将系统时钟、GPIO、串口等外设配置好,以使得FreeRTOS可以正确操作这些硬件。在芯片厂商提供的datasheet和reference manual里可以找到详细的配置方法。 2. FreeRTOS内核:可以下载FreeRTOS源码,并将其移植STM32F1系列芯片上。如果不想从源码开始,也可以使用一些现有的移植好的FreeRTOS库。 3. 任务创建:在FreeRTOS中,我们可以通过xTaskCreate()函数创建一个新的任务任务可以有不同的优先级,每个任务也可以拥有不同的栈,以保证任务之间的独立性。 4. 任务调度:FreeRTOS会根据任务的优先级和任务状态来进行调度,高优先级的任务会先于低优先级的任务执行。在任务执行期间,其他任务会进入等待状态。 5. 事件消息:在FreeRTOS中,我们可以使用消息队列等机制实现任务之间的通信。任务之间可以互相发送消息、事件和信号量,以实现同步和共享数据。 总之,利用FreeRTOS可以在STM32F1系列单片机上实现多任务、实时控制和通信等复杂功能。然而,实时操作系统的使用需要较高的编程水平和专业知识,需要仔细学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比可乐更酸甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值