tx_application_define用于任务的创建

tx_application_define用于任务的创建,它的具体内容需要我们来实现,接下来我们就来实现tx_application_define这个函数。

        我们计划实现5个任务,包括启动任务、红灯闪烁任务、绿灯闪烁任务、空闲任务及统计任务。其中为启动任务用于初始化一些配置并执行一些如系统心跳、看门狗之类的工作;用于红灯闪烁任务和绿灯闪烁任务用于实现我们要操作的指示灯控制;空闲任务在其他任务不运行时其运行,优先级最低。统计任务再次我们实现系统空闲率的统计。接下来我们就按此思路来实现。

/*tx_application_define函数实现*/
void  tx_application_define(void *first_unused_memory)
{
 
  /**************创建启动任务*********************/
  tx_thread_create(&AppTaskStartTCB,              /* 任务控制块地址 */  
                "App Task Start",              /* 任务名 */
                AppTaskStart,                  /* 启动任务函数地址 */
                0,                             /* 传递给任务的参数 */
                &AppTaskStartStk[0],            /* 堆栈基地址 */
                APP_CFG_TASK_START_STK_SIZE,  /* 堆栈空间大小 */ 
                APP_CFG_TASK_START_PRIO,      /* 任务优先级*/
                APP_CFG_TASK_START_PRIO,      /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,              /* 不开启时间片 */
                TX_AUTO_START);                /* 创建后立即启动 */
 
  /**************创建红灯闪烁任务*********************/
  tx_thread_create(&AppTaskRedLedTCB,           /* 任务控制块地址 */
                "App Msp Pro",                 /* 任务名 */
                AppTaskRedLED,              /* 启动任务函数地址 */
                0,                           /* 传递给任务的参数 */
                &AppTaskMsgProStk[0],        /* 堆栈基地址 */
                APP_CFG_TASK_RedLED_STK_SIZE,  /* 堆栈空间大小 */
                APP_CFG_TASK_REDLED_PRIO,      /* 任务优先级*/
                APP_CFG_TASK_REDLED_PRIO,     /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,               /* 不开启时间片 */
                TX_AUTO_START);                /* 创建后立即启动 */
 
  /**************创建绿灯闪烁任务*********************/
  tx_thread_create(&AppTaskGreenLEDTCB,        /* 任务控制块地址 */
                "App Task UserIF",              /* 任务名 */
                AppTaskGreenLED,             /* 启动任务函数地址 */
                0,                         /* 传递给任务的参数 */
                &AppTaskUserIFStk[0],         /* 堆栈基地址 */
                APP_CFG_TASK_GreenLED_STK_SIZE, /* 堆栈空间大小 */
                APP_CFG_TASK_GREENLED_PRIO,     /* 任务优先级*/
                APP_CFG_TASK_GREENLED_PRIO,   /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,               /* 不开启时间片 */
                TX_AUTO_START);             /* 创建后立即启动 */
 
  /**************创建统计任务*********************/
  tx_thread_create(&AppTaskStatTCB,               /* 任务控制块地址 */   
                   "App Task STAT",              /* 任务名 */
                   AppTaskStat,                  /* 启动任务函数地址 */
                   0,                           /* 传递给任务的参数 */
                   &AppTaskStatStk[0],           /* 堆栈基地址 */
                   APP_CFG_TASK_STAT_STK_SIZE,  /* 堆栈空间大小 */ 
                   APP_CFG_TASK_STAT_PRIO,      /* 任务优先级*/
                   APP_CFG_TASK_STAT_PRIO,     /* 任务抢占阀值 */
                   TX_NO_TIME_SLICE,            /* 不开启时间片 */
                   TX_AUTO_START);             /* 创建后立即启动 */
 
  /**************创建空闲任务*********************/
  tx_thread_create(&AppTaskIdleTCB,               /* 任务控制块地址 */   
                   "App Task IDLE",              /* 任务名 */
                   AppTaskIDLE,               /* 启动任务函数地址 */
                   0,                          /* 传递给任务的参数 */
                   &AppTaskIdleStk[0],          /* 堆栈基地址 */
                   APP_CFG_TASK_IDLE_STK_SIZE,  /* 堆栈空间大小 */
                   APP_CFG_TASK_IDLE_PRIO,       /* 任务优先级*/
                   APP_CFG_TASK_IDLE_PRIO,     /* 任务抢占阀值 */
                   TX_NO_TIME_SLICE,           /* 不开启时间片 */
                   TX_AUTO_START);            /* 创建后立即启动 */
}/*tx_application_define函数实现*/
void  tx_application_define(void *first_unused_memory)
{
 
  /**************创建启动任务*********************/
  tx_thread_create(&AppTaskStartTCB,              /* 任务控制块地址 */  
                "App Task Start",              /* 任务名 */
                AppTaskStart,                  /* 启动任务函数地址 */
                0,                             /* 传递给任务的参数 */
                &AppTaskStartStk[0],            /* 堆栈基地址 */
                APP_CFG_TASK_START_STK_SIZE,  /* 堆栈空间大小 */ 
                APP_CFG_TASK_START_PRIO,      /* 任务优先级*/
                APP_CFG_TASK_START_PRIO,      /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,              /* 不开启时间片 */
                TX_AUTO_START);                /* 创建后立即启动 */
 
  /**************创建红灯闪烁任务*********************/
  tx_thread_create(&AppTaskRedLedTCB,           /* 任务控制块地址 */
                "App Msp Pro",                 /* 任务名 */
                AppTaskRedLED,              /* 启动任务函数地址 */
                0,                           /* 传递给任务的参数 */
                &AppTaskMsgProStk[0],        /* 堆栈基地址 */
                APP_CFG_TASK_RedLED_STK_SIZE,  /* 堆栈空间大小 */
                APP_CFG_TASK_REDLED_PRIO,      /* 任务优先级*/
                APP_CFG_TASK_REDLED_PRIO,     /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,               /* 不开启时间片 */
                TX_AUTO_START);                /* 创建后立即启动 */
 
  /**************创建绿灯闪烁任务*********************/
  tx_thread_create(&AppTaskGreenLEDTCB,        /* 任务控制块地址 */
                "App Task UserIF",              /* 任务名 */
                AppTaskGreenLED,             /* 启动任务函数地址 */
                0,                         /* 传递给任务的参数 */
                &AppTaskUserIFStk[0],         /* 堆栈基地址 */
                APP_CFG_TASK_GreenLED_STK_SIZE, /* 堆栈空间大小 */
                APP_CFG_TASK_GREENLED_PRIO,     /* 任务优先级*/
                APP_CFG_TASK_GREENLED_PRIO,   /* 任务抢占阀值 */
                TX_NO_TIME_SLICE,               /* 不开启时间片 */
                TX_AUTO_START);             /* 创建后立即启动 */
 
  /**************创建统计任务*********************/
  tx_thread_create(&AppTaskStatTCB,               /* 任务控制块地址 */   
                   "App Task STAT",              /* 任务名 */
                   AppTaskStat,                  /* 启动任务函数地址 */
                   0,                           /* 传递给任务的参数 */
                   &AppTaskStatStk[0],           /* 堆栈基地址 */
                   APP_CFG_TASK_STAT_STK_SIZE,  /* 堆栈空间大小 */ 
                   APP_CFG_TASK_STAT_PRIO,      /* 任务优先级*/
                   APP_CFG_TASK_STAT_PRIO,     /* 任务抢占阀值 */
                   TX_NO_TIME_SLICE,            /* 不开启时间片 */
                   TX_AUTO_START);             /* 创建后立即启动 */
 
  /**************创建空闲任务*********************/
  tx_thread_create(&AppTaskIdleTCB,               /* 任务控制块地址 */   
                   "App Task IDLE",              /* 任务名 */
                   AppTaskIDLE,               /* 启动任务函数地址 */
                   0,                          /* 传递给任务的参数 */
                   &AppTaskIdleStk[0],          /* 堆栈基地址 */
                   APP_CFG_TASK_IDLE_STK_SIZE,  /* 堆栈空间大小 */
                   APP_CFG_TASK_IDLE_PRIO,       /* 任务优先级*/
                   APP_CFG_TASK_IDLE_PRIO,     /* 任务抢占阀值 */
                   TX_NO_TIME_SLICE,           /* 不开启时间片 */
                   TX_AUTO_START);            /* 创建后立即启动 */
}

我们实现了tx_application_define函数,在其中创建了任务,理所当然我们还需要实现相应的任务函数。

/*系统启动任务*/
static  void  AppTaskStart (ULONG thread_input)
{
  (void)thread_input;
 
  /* 任务统计前先挂起其它任务 */
  tx_thread_suspend(&AppTaskRedLedTCB);
  tx_thread_suspend(&AppTaskGreenLEDTCB);
 
  OSStatInit();
 
  /* 任务统计完毕后,恢复其它任务 */      
  tx_thread_resume(&AppTaskRedLedTCB);
  tx_thread_resume(&AppTaskGreenLEDTCB);
 
  /* 内核开启后,恢复HAL里的时间基准 */
  HAL_ResumeTick();
 
  while (1)
  { 
    sysHeartBeat++;
    tx_thread_sleep(1000);
  }
}
 
/*红灯闪烁控制*/
static void AppTaskRedLED(ULONG thread_input)
{
  (void)thread_input;
 
  while(1)
  {
    HAL_GPIO_TogglePin(GPIOI,GPIO_PIN_8);
    tx_thread_sleep(500);
  }  
}
 
/*绿灯闪烁控制*/
static void AppTaskGreenLED(ULONG thread_input)
{
  (void)thread_input;
 
  while(1)
  {       
   
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    tx_thread_sleep(2000);
  }
}
 
/*统计任务函数*/
static void AppTaskStat(ULONG thread_input)
{
  (void)thread_input;
 
  while (OSStatRdy == false)
  {
    tx_thread_sleep(200);     /* 等待统计任务就绪 */
  }
 
  OSIdleCtrMax /= 100uL;
  if (OSIdleCtrMax == 0uL)
  {
    OSCPUUsage = 0u;
  }
 
  OSIdleCtr = OSIdleCtrMax * 100uL;  /* 设置初始CPU利用率 0% */
 
  for (;;)
  {
    OSIdleCtrRun = OSIdleCtr;    /* 获得100ms内空闲计数 */
    OSIdleCtr    = 0uL;          /* 复位空闲计数 */
    OSCPUUsage   = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
    tx_thread_sleep(100);        /* 每100ms统计一次 */
  }
}
 
/*空闲任务函数*/
static void AppTaskIDLE(ULONG thread_input)
{    
  TX_INTERRUPT_SAVE_AREA
   
  (void)thread_input;
 
  while(1)
  {
    TX_DISABLE
      OSIdleCtr++;
    TX_RESTORE
  }                          
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供完整的代码,但是我可以给你一些参考。 首先,你需要在stm32f103c8t6上运行一个程序来控制esp8266-01s模块。你可以使用STM32的UART串口和ESP8266-01s的AT指令来进行通信。 以下是一个简单的程序示例,可以让STM32通过ESP8266-01s连接到OneNet平台: ```c #include "stm32f10x.h" #include "stdio.h" #include "string.h" #define ESP8266_RX_BUFFER_SIZE 1024 #define ESP8266_TX_BUFFER_SIZE 1024 char esp8266_rx_buffer[ESP8266_RX_BUFFER_SIZE]; char esp8266_tx_buffer[ESP8266_TX_BUFFER_SIZE]; void esp8266_init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void esp8266_send_command(char* command) { while (*command != '\0') { USART_SendData(USART1, *command++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } void esp8266_receive_response(void) { int i = 0; while (1) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); char c = USART_ReceiveData(USART1); if (c == '\r' || c == '\n') continue; esp8266_rx_buffer[i++] = c; if (i >= ESP8266_RX_BUFFER_SIZE) break; if (strstr(esp8266_rx_buffer, "OK") != NULL) break; if (strstr(esp8266_rx_buffer, "ERROR") != NULL) break; if (strstr(esp8266_rx_buffer, "FAIL") != NULL) break; } } void esp8266_connect_to_onenet(char* api_key, char* device_id) { sprintf(esp8266_tx_buffer, "AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"); esp8266_send_command(esp8266_tx_buffer); esp8266_receive_response(); sprintf(esp8266_tx_buffer, "AT+CIPSTART=\"TCP\",\"api.heclouds.com\",80\r\n"); esp8266_send_command(esp8266_tx_buffer); esp8266_receive_response(); sprintf(esp8266_tx_buffer, "AT+CIPSEND=%d\r\n", strlen(api_key) + strlen(device_id) + 70); esp8266_send_command(esp8266_tx_buffer); esp8266_receive_response(); sprintf(esp8266_tx_buffer, "POST /devices/%s/datapoints HTTP/1.1\r\n", device_id); esp8266_send_command(esp8266_tx_buffer); sprintf(esp8266_tx_buffer, "api-key:%s\r\n", api_key); esp8266_send_command(esp8266_tx_buffer); sprintf(esp8266_tx_buffer, "Host: api.heclouds.com\r\n"); esp8266_send_command(esp8266_tx_buffer); sprintf(esp8266_tx_buffer, "Content-Type: application/json\r\n"); esp8266_send_command(esp8266_tx_buffer); sprintf(esp8266_tx_buffer, "Content-Length: 25\r\n\r\n"); esp8266_send_command(esp8266_tx_buffer); sprintf(esp8266_tx_buffer, "{\"datastreams\":[{\"id\":\"temp\",\"datapoints\":[{\"value\":\"26.5\"}]}]}\r\n"); esp8266_send_command(esp8266_tx_buffer); esp8266_receive_response(); sprintf(esp8266_tx_buffer, "AT+CIPCLOSE\r\n"); esp8266_send_command(esp8266_tx_buffer); esp8266_receive_response(); } int main(void) { char* api_key = "your_api_key_here"; char* device_id = "your_device_id_here"; esp8266_init(); esp8266_connect_to_onenet(api_key, device_id); while (1) { } } ``` 在这个示例中,我们使用了ESP8266-01s模块连接到OneNet平台,并发送了一个简单的JSON数据点。这个程序只是一个示例,你需要根据自己的需求进行修改和扩展。同时,请确保你已经正确连接了ESP8266-01s模块到你的STM32开发板上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值