你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

RTOS+LwIP Socket 不工作的问题

[复制链接]
思以智胜 提问时间:2018-1-29 12:26 /
本人用RTOS创建了五个任务, 如下:

  1.    /* RTOS 多任务创建调度机制 */
  2.    osThreadDef(TCPSOCKETSERVER, TCP_Socket_Server, osPriorityRealtime, 0, 512);          1
  3.    TCPSOCKETSERVERHandle = osThreadCreate(osThread(TCPSOCKETSERVER), NULL);

  4.    osThreadDef(STM32F4ADC, STM32F429_ADC1_Init, osPriorityNormal, 0, 512);                2
  5.    STM32F4ADCRHandle = osThreadCreate(osThread(STM32F4ADC), NULL);
  6.    
  7.    osThreadDef(RTCCLOCKTIME, RTC_CLOCK_TIME, osPriorityNormal, 0, 512);                   3
  8.    RTCCLOCKTIMEHandle = osThreadCreate(osThread(RTCCLOCKTIME), NULL);
  9.    
  10.    osThreadDef(RTOSLEDTEST, RTOS_LED_TEST,osPriorityNormal, 0, 512);                       4
  11.    RTOSLEDTESTHandle = osThreadCreate(osThread(RTOSLEDTEST), NULL);
  12.    
  13.    osThreadDef(RTOSKEYEXIT, RTOS_KEY_EXIT, osPriorityNormal, 0, 512);                        5
  14.    RTOSKEYEXITHandle = osThreadCreate(osThread(RTOSKEYEXIT), NULL);
复制代码
同时运行的时候, 2,3,4,5 工作正常,1 可以创建任务,只是无法Ping通,暂停2,3,4,5 单独执行1 ,就没问题,不知道这个问题出在哪里,很愚蒙


  1. /**
  2.   ******************************************************************************
  3.   * File Name          : main.c
  4.   * Description        : Main program body
  5.   ******************************************************************************
  6.   * This notice applies to any and all portions of this file
  7.   * that are not between comment pairs USER CODE BEGIN and
  8.   * USER CODE END. Other portions of this file, whether
  9.   * inserted by the user or by software development tools
  10.   * are owned by their respective copyright owners.
  11.   *
  12.   * Copyright (c) 2017-2018 淮安奥创科技有限公司
  13.   * All rights reserved.
  14.   *
  15.   ******************************************************************************
  16.   */

  17. /* Includes ------------------------------------------------------------------*/
  18. #include "main.h"
  19. #include "stm32f4xx_hal.h"
  20. #include "tcp_socket_server.h"
  21. #include "stm32f429_device_Init.h"
  22. #include "stm32f4xx_oled_conf.h"
  23. #include "stm32f4xx_oled_image.h"
  24. #include "cmsis_os.h"
  25. #include "lwip.h"


  26. #define V25            0.76            // V25 = 25 °C 时的电压值 0.76 (mV)
  27. #define KeyTaskNumber  5               // 当前需要KEY切换的任务数值

  28. /* Private variables ---------------------------------------------------------*/
  29. osThreadId TCPSOCKETSERVERHandle;
  30. osThreadId STM32F4ADCRHandle;
  31. osThreadId RTCCLOCKTIMEHandle;
  32. osThreadId RTOSLEDTESTHandle;
  33. osThreadId RTOSKEYEXITHandle;

  34. /* Private function prototypes -----------------------------------------------*/
  35. static void TCP_Socket_Server(void const * argument);
  36. static void STM32F429_ADC1_Init(void const * argument);
  37. static void RTC_CLOCK_TIME(void const * argument);
  38. static void RTOS_LED_TEST(void const * argument);
  39. static void RTOS_KEY_EXIT(void const * argument);
  40. static void STM32_System_PowerON(void);
  41. static void RTOS_TASK_Init(void);

  42. /* USER CODE BEGIN PFP */
  43. /* Private function prototypes -----------------------------------------------*/

  44. int main(int argc, char **argv) {

  45.    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  46.    HAL_Init();

  47.    /* Configure the system clock */
  48.    SystemClock_Config();

  49.    /* Initialize all configured peripherals */
  50.    MX_GPIO_Init();
  51.    
  52.    OLED_GPIO_Init();

  53.    STM32_System_PowerON();

  54.    MX_USART3_UART_Init();
  55.    
  56.    RTOS_TASK_Init();

  57.    /* RTOS 开始调度内核 */
  58.    osKernelStart();

  59.    /* USER CODE BEGIN WHILE */
  60.    while (1) {

  61.    }

  62. }

  63. static void RTOS_TASK_Init() {
  64.    /* RTOS 多任务创建调度机制 */
  65.    osThreadDef(TCPSOCKETSERVER, TCP_Socket_Server, osPriorityRealtime, 0, 512);
  66.    TCPSOCKETSERVERHandle = osThreadCreate(osThread(TCPSOCKETSERVER), NULL);

  67.    osThreadDef(STM32F4ADC, STM32F429_ADC1_Init, osPriorityNormal, 0, 512);
  68.    STM32F4ADCRHandle = osThreadCreate(osThread(STM32F4ADC), NULL);
  69.    
  70.    osThreadDef(RTCCLOCKTIME, RTC_CLOCK_TIME, osPriorityNormal, 0, 512);
  71.    RTCCLOCKTIMEHandle = osThreadCreate(osThread(RTCCLOCKTIME), NULL);
  72.    
  73.    osThreadDef(RTOSLEDTEST, RTOS_LED_TEST,osPriorityNormal, 0, 512);
  74.    RTOSLEDTESTHandle = osThreadCreate(osThread(RTOSLEDTEST), NULL);
  75.    
  76.    osThreadDef(RTOSKEYEXIT, RTOS_KEY_EXIT, osPriorityNormal, 0, 512);
  77.    RTOSKEYEXITHandle = osThreadCreate(osThread(RTOSKEYEXIT), NULL);
  78. }

  79. static void TCP_Socket_Server(void const * argument) {
  80.   /* LwIP 初始化栈 */
  81.   MX_LWIP_Init();
  82.   for(;;) {
  83.      Tcp_Socket_Serve_Init();
  84.      osDelay(100);
  85.   }
  86. }

  87. static void STM32F429_ADC1_Init(void const * argument) {
  88.    double Voltage1 = 0,Voltage2 = 0,Voltage3 = 0;
  89.    uint32_t i = 0;
  90.    uint32_t ADC_ConvertedValue[3];
  91.    __IO uint16_t ADC_Temperature;
  92.    MX_DMA_Init();
  93.    MX_ADC1_Init();
  94.    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue, 3);
  95.    for(;;) {
  96.       /*
  97.        * ADC_ConvertedValue*3.3/4096为将数据转化为电压,单位为V
  98.        * V25 = 0.76V Avg_Slope = 2.5(mv) = 0.0025V
  99.        * 使用以下公式计算温度:
  100.        * 温度(单位为 °C) = {(VSENSE — V25) / Avg_Slope} + 25
  101.        * 其中:
  102.        * — V25 = 25 °C 时的 VSENSE 值   
  103.        * — Avg_Slope = 温度与 VSENSE 曲线的平均斜率(以 mV/°C 或 μV/°C 表示)
  104.        */
  105.       for(i = 0; i < 3; i++) {
  106.          printf("ADC1-ARM_CPU_TEMP电压采集(DMA): ");
  107.          printf("[%d] -> %d \n\r",i, ADC_ConvertedValue[i]);
  108.       }
  109.       printf("-------------------------------------------- \n\r");      
  110.       Voltage1 = (float)ADC_ConvertedValue[0] *3.3/4096;
  111.       Voltage2 = (float)ADC_ConvertedValue[1] *3.3/4096;
  112.       Voltage3 = (float)ADC_ConvertedValue[2] *3.3/4096;
  113.       printf(" Voltage1 = %f \n\r Voltage2 = %f \n\r Voltage3 = %f \n\r",Voltage1, Voltage2, Voltage3);
  114.       ADC_Temperature = (Voltage1 - V25) / 0.0025 + 25;
  115.       printf(" CPU_TEMP = %d °C \n\r",ADC_Temperature);
  116.       printf("-------------------------------------------- \n\r");
  117.       osDelay(100);
  118.    }
  119. }

  120. static void RTC_CLOCK_TIME(void const * argument) {
  121.    /* RTC 时钟初始化函数 */
  122.    MX_RTC_Init();
  123.    for(;;) {
  124.       HAL_RTC_GetTime(&hrtc, &TimeInit, RTC_FORMAT_BIN);       // 获取RTC当前时间(必须先获取时间)
  125.       HAL_RTC_GetDate(&hrtc, &DateInit, RTC_FORMAT_BIN);       // 获取RTC当前日期
  126.       printf("-------------------------RTC 实时时钟显示-----------------------\n\r");
  127.       printf("公历:%2d年%d月%d日 \n\r",2000+DateInit.Year, DateInit.Month, DateInit.Date);
  128.       printf("时间:%-2d时%d分%d秒 \n\r",TimeInit.Hours, TimeInit.Minutes, TimeInit.Seconds);
  129.       printf("----------------------------------------------------------------\n\r");
  130.       osDelay(100);
  131.    }
  132. }

  133. static void RTOS_LED_TEST(void const * argument) {
  134.    for(;;) {
  135.       LED3_RED_SET();
  136.       osDelay(520);
  137.       LED3_RED_RESET();
  138.       osDelay(520);
  139.    }
  140. }

  141. static void RTOS_KEY_EXIT(void const * argument) {
  142.    uint32_t count = 0;
  143.    for(;;) {
  144.       if(KEY_LED_SWITCH() == Key_Down) {
  145.          count++;
  146.       }
  147.       if(count > KeyTaskNumber) {
  148.          count = 0;
  149.       }
  150.       printf("按键计数: %d \n\r",count);
  151.       osDelay(100);
  152.    }
  153. }

  154. void STM32_System_PowerON() {
  155.    OLED_IMAGES_SHOW(2,128,LiYaOSLogo);               
  156.    HAL_Delay(2500);
  157. }

  158. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


收藏 1 评论1 发布时间:2018-1-29 12:26

举报

1个回答
zhangxu56726 回答时间:2018-1-30 10:46:05
看下 分配的内存 和线程优先级

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版