记录问题--------使用STM32cubeMX FREERTOS 创间消息队列编译报错

 

stm32cubemx 版本5.6.0
keil版本5.29.0
freertos.c中代码
 



/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

  
#include "can.h"
#include "gpio.h"
#include "KincoServo.h"




osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};

osThreadId_t myTask02_LedHandle;
const osThreadAttr_t myTask02_Led_attributes = {
  .name = "myTask02_Led",
  .priority = (osPriority_t) osPriorityLow,
  .stack_size = 128 * 4
};

osThreadId_t myTask03_MotorHandle;
const osThreadAttr_t myTask03_Motor_attributes = {
  .name = "myTask03_Motor",
  .priority = (osPriority_t) osPriorityLow,
  .stack_size = 128 * 4
};

osThreadId_t myTask04_CanTxHandle;
const osThreadAttr_t myTask04_CanTx_attributes = {
  .name = "myTask04_CanTx",
  .priority = (osPriority_t) osPriorityLow,
  .stack_size = 128 * 4
};

osMessageQueueId_t myQueue01Handle;
const osMessageQueueAttr_t myQueue01_attributes = {
  .name = "myQueue01"
};



void StartDefaultTask(void *argument);
void StartTask02_LedFunction(void *argument);
void StartTask03_MotorFunction(void *argument);
void StartTask04_CanTxFunction(void *argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */


void MX_FREERTOS_Init(void) {




  myQueue01Handle = osMessageQueueNew (16, sizeof(uint16_t), &myQueue01_attributes);


  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
  myTask02_LedHandle = osThreadNew(StartTask02_LedFunction, NULL, &myTask02_Led_attributes);
  myTask03_MotorHandle = osThreadNew(StartTask03_MotorFunction, NULL, &myTask03_Motor_attributes);


  myTask04_CanTxHandle = osThreadNew(StartTask04_CanTxFunction, NULL, &myTask04_CanTx_attributes);


}


void StartDefaultTask(void *argument)
{

  for(;;)
  {
    osDelay(1);
  }
}


void StartTask02_LedFunction(void *argument)
{

  for(;;)
  {
                HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
                osDelay(1000);
                HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
  }

}


void StartTask03_MotorFunction(void *argument)
{


        FindOrigin(1);
        osDelay(2000);
        GetStates(1);

        SetInterpolationModeType();
        osMessagePut(myQueue01Handle,1,osWaitForever);

  for(;;)
  {                   
                osDelay(1);        
  }

}


void StartTask04_CanTxFunction(void *argument)
{

  for(;;)
  {
                osDelay(1);
  }

}


敲代码的时候 能自动补全,也没有报错  osMessagePut(myQueue01Handle,1,osWaitForever);
但编译的时候报错了 ,提示没有定义
test\test.axf: Error: L6218E: Undefined symbol osMessagePut (referred from freertos.o).

 

问题解决,是cube中cmsisi库版本的问题V1和V2版本对osMessagePut等函数定义不同,v1版本没这个问题 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个开源的实时操作系统内核,被广泛应用于嵌入式系统中。ESP32是一款具有双核处理器和Wi-Fi功能的芯片,通过使用ESP-IDF开发框架可以进行软件开发。在ESP32-IDF开发中,使用FreeRTOS消息队列可以实现不同任务之间的通信。 在ESP32开发中,可以通过中断服务程序(Interrupt Service Routine,ISR)来发送消息到消息队列,并在任务中通过接收方法响应。 首先,我们需要创建一个全局的消息队列句柄,可以使用xQueueCreate函数来创建一个消息队列。例如,可以使用以下代码创建一个大小为10的消息队列: xQueueHandle messageQueue = xQueueCreate(10, sizeof(int)); 然后,在中断服务程序中,可以使用xQueueSendFromISR方法将消息发送到消息队列中。例如,可以使用以下代码将一个整数值发送到消息队列中: int value = 100; xQueueSendFromISR(messageQueue, &value, NULL); 在任务中,可以使用xQueueReceive方法从消息队列中接收消息并进行响应。例如,可以使用以下代码从消息队列中接收一个整数值并打印出来: int receivedValue; xQueueReceive(messageQueue, &receivedValue, portMAX_DELAY); printf("Received value: %d\n", receivedValue); 需要注意的是,在接收消息时,可以通过指定第三个参数来设置等待时间。例如,使用portMAX_DELAY表示无限等待,即直到接收到消息为止。 通过以上步骤,我们可以实现在ESP32开发中使用FreeRTOS消息队列进行中断服务消息发送与响应。这种方式可以实现不同任务之间的通信和同步,提高系统的并发性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值