c语言sscanf函数的用法是什么
184
2024-01-26
挂起可以理解为暂时停止任务,恢复可以理解为从新启动挂起的任务挂起API函数(可以在tasks.c中找到)复制vTaskSuspend( TaskHandle_t xTaskToSuspend ) xTaskToSuspend:需要挂起的任务句柄
非中断恢复API函数(可以在tasks.c中找到)复制vTaskResume( TaskHandle_t xTaskToResume ) xTaskToSuspend:需要挂起的任务句柄中断恢复API函数(可以在tasks.c中找到)
复制xTaskResumeFromISR( TaskHandle_t xTaskToResume ) xTaskToSuspend:需要挂起的任务句柄注意:中断中不可以使用复制vTaskDelay( const
TickType_t xTicksToDelay ) 实验目的通过按键控制LED0任务的挂起与恢复任务挂起与恢复复制#include"stm32f10x.h"#include"stm32f10x.h"#
include#include"FreeRTOS.h"#include"task.h"uint8_t main_temp = 0; voidLED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_5;
//端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//IO口速度为50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHzGPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_5);
//输出高 } voidKEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 RCC_APB2PeriphClockCmd
(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//下拉输入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率GPIO_Init(GPIOA,&GPIO_InitStructure);
/* 初始化GPIO */ } // 外部中断初始化voidMy_EXTI_Init(void){ NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
//选择GPIO管脚用作外部中断线路//EXTI0 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=
2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure); } #define START_TASK_PRIO 1 //任务优先级#define START_STK_SIZE 128 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄voidstart_task(void *pvParameters); //任务函数#define LED0_TASK_PRIO 2
//任务优先级#define LED0_STK_SIZE 50 //任务堆栈大小 TaskHandle_t LED0Task_Handler; //任务句柄voidled0_task(void *p_arg)
; //任务函数#define LED1_TASK_PRIO 2 //任务优先级#define LED1_STK_SIZE 50 //任务堆栈大小 TaskHandle_t LED1Task_Handler;
//任务句柄voidled1_task(void *p_arg); //任务函数#define KEY0_TASK_PRIO 2 //任务优先级#define KEY0_STK_SIZE 50 //任务堆栈大小
TaskHandle_t KEY0Task_Handler; //任务句柄voidkey0_task(void *p_arg); //任务函数intmain( void ){ NVIC_PriorityGroupConfig
(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4LED_Init(); //初始化 LEDKEY_Init(); My_EXTI_Init(); //创建开始任务xTaskCreate
( (TaskFunction_t )start_task, //任务函数 (constchar* )"start_task", //任务名称 (uint16_t
)START_STK_SIZE, //任务堆栈大小 (void* )NULL, //传递给任务函数的参数 (UBaseType_t )START_TASK_PRIO,
//任务优先级 (TaskHandle_t* )&StartTask_Handler //任务句柄 ); vTaskStartScheduler(); //开启调度 } void
start_task(void *pvParameters){ taskENTER_CRITICAL(); //进入临界区//创建 LED0 任务xTaskCreate( (TaskFunction_t )led0_task, (
constchar* )"led0_task", (uint16_t )LED0_STK_SIZE, (void* )NULL, (UBaseType_t )LED0_TASK_PRIO, (TaskHandle_t* )&LED0Task_Handler );
//创建 LED1 任务xTaskCreate( (TaskFunction_t )led1_task, (constchar* )"led1_task", (uint16_t
)LED1_STK_SIZE, (void* )NULL, (UBaseType_t )LED1_TASK_PRIO, (TaskHandle_t* )&LED1Task_Handler );
//创建 KEY0 任务xTaskCreate( (TaskFunction_t )key0_task, (constchar* )"key0_task", (uint16_t
)KEY0_STK_SIZE, (void* )NULL, (UBaseType_t )KEY0_TASK_PRIO, (TaskHandle_t* )&KEY0Task_Handler );
vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区 } //LED0 任务函数voidled0_task(void
*pvParameters){ while(1) { if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_5)) { GPIO_ResetBits
( GPIOC, GPIO_Pin_5); } else { GPIO_SetBits( GPIOC, GPIO_Pin_5); } vTaskDelay
(400); } } //LED1 任务函数voidled1_task(void *pvParameters){ while(1) { if(GPIO_ReadInputDataBit
( GPIOC, GPIO_Pin_1)) { GPIO_ResetBits( GPIOC, GPIO_Pin_1); } else { GPIO_SetBits
( GPIOC, GPIO_Pin_1); } vTaskDelay(200); } } //KEY0 任务函数voidkey0_task(void *pvParameters)
{ while(1) { if( main_temp == 0xff ){ //任务挂起(非中断)//vTaskSuspend(LED0Task_Handler); }
else{ //任务恢复(非中断)//vTaskResume(LED0Task_Handler); } vTaskDelay(100); } } //按键中断服务函数
voidEXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0)==1) { if( main_temp ){ main_temp =
0x00; //中断函数中进行任务恢复(区分中断)xTaskResumeFromISR(LED0Task_Handler); } else{ main_temp =
0xff; //任务挂起(谨慎在中断使用,虽然可以达到初步效果,不保证不会出问题)vTaskSuspend(LED0Task_Handler); } } EXTI_ClearITPendingBit
(EXTI_Line0); } --END--
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~