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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版