好利来 丝袜 FREERTOS任务见知模拟事件象征组执行

发布日期:2024-12-06 12:52    点击次数:110


好利来 丝袜 FREERTOS任务见知模拟事件象征组执行

代码:好利来 丝袜

主形状

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"
#include "freertos_demo.h"
#include "./BSP/SDRAM/sdram.h"
#include "./MALLOC/malloc.h"

#define START_TASK_PRIO 1
#define START_STK_SIZE 128

const char *SRAM_NAME_BUF[SRAMBANK] = {" SRAMIN  ", " SRAMCCM ", " SRAMEX  "};

int main(void)
{
    

    HAL_Init();                                          /* 开动化HAL库 */
    sys_stm32_clock_init(360, 25, 2, 8);                 /* 开发时钟,180Mhz */
    delay_init(180);                                     /* 延时开动化 */
    usart_init(115200);                                  /* 串口开动化为115200 */
    //usmart_dev.init(90);                                 /* 开动化USMART */
    led_init();                                          /* 开动化LED */
    key_init();                                          /* 开动化按键 */
    sdram_init();                                        /* SRAM开动化 */
    //lcd_init();                                          /* 开动化LCD */
		extix_init();
    my_mem_init(SRAMIN);                                 /* 开动化里面内存池 */
    my_mem_init(SRAMEX);                                 /* 开动化外部内存池 */
    my_mem_init(SRAMCCM);                                /* 开动化CCM内存池 */
    
//    lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);
//    lcd_show_string(30,  70, 200, 16, 16, "MALLOC TEST", RED);
//    lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);
//    lcd_show_string(30, 110, 200, 16, 16, "KEY0:Malloc  KEY2:Free", RED);
//    lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:SRAMx KEY1:Read", RED);
//    lcd_show_string(60, 160, 200, 16, 16, " SRAMIN ", BLUE);
//    lcd_show_string(30, 176, 200, 16, 16, "SRAMIN   USED:", BLUE);
//    lcd_show_string(30, 192, 200, 16, 16, "SRAMCCM  USED:", BLUE);
//    lcd_show_string(30, 208, 200, 16, 16, "SRAMEX   USED:", BLUE);
    
    
    freertos_demo();
}

freertos_demo.c

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "string.h"
#include "limits.h"

/******************************************************************************************************/
/*FreeRTOS设置*/

/* START_TASK 任务 设置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO 1                   /* 任务优先级 */
#define START_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            StartTask_Handler;  /* 任务句柄 */
void start_task(void *pvParameters);        /* 任务函数 */


/* TASK1 任务 设置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define EVENTSETBIT_PRIO      2                   /* 任务优先级 */
#define EVENTSETBIT_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            EventSetBit_Handler;  /* 任务句柄 */
void eventsetbit(void *pvParameters);             /* 任务函数 */

#define EVENTGROUP_PRIO      2                   /* 任务优先级 */
#define EVENTGROUP_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            EventGroup_Handler;  /* 任务句柄 */
void eventgroup(void *pvParameters);             /* 任务函数 */
#define KEYMSG_Q_NUM  1
          /* 任务函数 */
QueueHandle_t Key_Queue;
#define EVENTBIT_0 (1<<0)
#define EVENTBIT_1 (1<<1)
#define EVENTBIT_2 (1<<2)

#define EVENTBIT_ALL (EVENTBIT_1|EVENTBIT_2)
/******************************************************************************************************/

/* LCD刷屏时使用的颜料 */


/**
 * @brief       FreeRTOS例程进口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{

		
    xTaskCreate((TaskFunction_t )start_task,            /* 任务函数 */
                (const char*    )"start_task",          /* 任务称号 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈大小 */
                (void*          )NULL,                  /* 传入给任务函数的参数 */
                (UBaseType_t    )START_TASK_PRIO,       /* 任务优先级 */
                (TaskHandle_t*  )&StartTask_Handler);   /* 任务句柄 */
    vTaskStartScheduler();
}

/**
 * @brief       start_task
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void start_task(void *pvParameters)
{
    
		taskENTER_CRITICAL();
	  Key_Queue=xQueueCreate(KEYMSG_Q_NUM,sizeof(uint8_t));
    /* 创建任务1 */
    xTaskCreate((TaskFunction_t )eventsetbit,
                (const char*    )"eventsetbit",
                (uint16_t       )EVENTSETBIT_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )EVENTSETBIT_PRIO,
                (TaskHandle_t*  )&EventSetBit_Handler);
    xTaskCreate((TaskFunction_t )eventgroup,
                (const char*    )"eventgroup",
                (uint16_t       )EVENTGROUP_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )EVENTGROUP_PRIO,
                (TaskHandle_t*  )&EventGroup_Handler);
//		xTaskCreate((TaskFunction_t )eventgroup,
//                (const char*    )"eventquery",
//                (uint16_t       )EVENTQUERY_STK_SIZE,
//                (void*          )NULL,
//                (UBaseType_t    )EVENTQUERY_PRIO,
//                (TaskHandle_t*  )&EventQuery_Handler);
    vTaskDelete(StartTask_Handler); /* 删除入手任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

/**
 * @brief       task1
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void eventsetbit(void *pvParameters)
{
   uint8_t key;
    while(1)
    {
			if(EventGroup_Handler!=NULL)
			{
				key=key_scan(0);
				switch(key)
				{
					case KEY1_PRES:
						xTaskNotify(EventGroup_Handler,EVENTBIT_1,eSetBits);
						//xEventGroupSetBits(EventGroupHandle,EVENTBIT_1);
						break;
					case KEY2_PRES:
						xTaskNotify(EventGroup_Handler,EVENTBIT_2,eSetBits);
						//xEventGroupSetBits(EventGroupHandle,EVENTBIT_2);
						break;
				}
			}	
				
        vTaskDelay(10);                                               /* 延时1000ticks */
    }
}
void eventgroup(void *pvParameters)
{
		uint8_t num=0;
		static uint8_t eventvalue,event0flag,event1flag,event2flag;
		BaseType_t err;
		uint32_t NotifyValue;
    while(1)
    {
				err=xTaskNotifyWait(0,ULONG_MAX,&NotifyValue,portMAX_DELAY);
				if(err==pdPASS)
				{
					if(NotifyValue & EVENTBIT_0)
					{
						event0flag=1;
					}
					else if(NotifyValue & EVENTBIT_1)
					{
						event1flag=1;
					}
					else if(NotifyValue & EVENTBIT_2)
					{
						event2flag=1;
					}
				}
				eventvalue=event0flag|(event1flag<<1)|(event2flag<<2);
				printf("eventvalue =%#x\r\n",eventvalue);
				if(eventvalue==0x07)
				{
					num++;
					event0flag=0;
					event1flag=0;
					event2flag=0;
					printf("event running =%d\r\n",num);
				}
        
			
    }
}

外部中断形状:

含羞草研究院在线看
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/EXTI/exti.h"
#include "FreeRTOS.h"
#include "task.h"

/**
 * @brief       KEY0 外部中断做事形状
 * @param       无
 * @retval      无
 */
//extern TaskHandle_t            Task2Task_Handler;
#define EVENTBIT_0 (1<<0)
/**
 * @brief       KEY1 外部中断做事形状
 * @param       无
 * @retval      无
 */

extern TaskHandle_t            EventGroup_Handler;  /* 任务句柄 */
/**
 * @brief       KEY2 外部中断做事形状
 * @param       无
 * @retval      无
 */
void KEY0_INT_IRQHandler(void)
{ 
    //HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN);        /* 调用中断处分公用函数,排除中断象征位 */
          /* 退出时再清一次中断,幸免按键抖动误触发 */
	delay_ms(20);                                       /* 消抖 */
    
        

        BaseType_t	xYieldRequired,xHigherPriorityTaskWoken;

        
            //if (KEY0 == 0)
            {
								xTaskNotifyFromISR(EventGroup_Handler,EVENTBIT_0,eSetBits,&xHigherPriorityTaskWoken);
                                         /* LED0 情景取反 */ 
								portYIELD_FROM_ISR(xYieldRequired);
						}
						
						
							//portYIELD_FROM_ISR(xYieldRequired);
					__HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN);  
           
}

/**
 * @brief       WK_UP 外部中断做事形状
 * @param       无
 * @retval      无
 */

/**
 * @brief       中断做事形状中需要作念的事情
                在HAL库中统共的外部中断做事函数王人会调用此函数
 * @param       GPIO_Pin:中断引脚号
 * @retval      无
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    
}

/**
 * @brief       外部中断开动化形状
 * @param       无
 * @retval      无
 */
void extix_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    key_init();
    

    
    
    gpio_init_struct.Pin = KEY0_INT_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 下落沿触发 */
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY0_INT_GPIO_PORT, &gpio_init_struct);    /* KEY2设置为下落沿触发中断 */
    
    

                      /* 使能中断线2 */
    
    HAL_NVIC_SetPriority(KEY0_INT_IRQn, 6, 0);               /* 霸占2,子优先级2 */
    HAL_NVIC_EnableIRQ(KEY0_INT_IRQn);                       /* 使能中断线13 */

                         /* 使能中断线0 */
}

成果图:

3.jpg

*博客实质为网友个东谈主发布好利来 丝袜,仅代表博主个东谈主不雅点,如有侵权请有关责任主谈主员删除。




Powered by 情趣萝莉 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024