zfz9232 发表于 2018-8-28 15:14:30

freeRTOS+Keil调试问题。

各位:最近使用FreeRTOS的时候,在GPIO口中断回调中调用了osMessagePut,用任务接这个消息。
结果发现消息是接到了,但是里面的值一直是0.

1、有谁知道这个原因

2、我想进这个消息队列中看看,但是keil貌似不给看,是我打开方式出错了?谁知道?

feixiang20 发表于 2018-8-29 02:40:50

是代码使用问题吗。。。
使能消息队列相关的函数
#define osFeature_MessageQ   1
定义消息队列的名字
osMessageQDef(MsgBox, 1, int); //创建一个长度为1,单位为int的消息队列
osMessageQIdMsgBox;               //消息队列的ID
创建队列
MsgBox = osMessageCreate(osMessageQ(MsgBox), NULL);
//穿件消息队列
向队列发送消息
osMessagePut(MsgBox, 1, osWaitForever);
注:1、这个函数实现向消息队列传送一个int数据1、并且进程一直阻塞知道
从队列接收消息
osEventevt;
evt = osMessageGet(MsgBox, osWaitForever);
osEvent数据传输过程中传输的数据 ,结构体定义如下
typedef struct{
osStatus               status;    //消息类型
union{
      uint32_t                  v;   //消息中为值
      void                     *p;   //消息中为指针
       int32_t               signals;   
      } value;                           ///< event value
   union{
       osMailQId             mail_id;   ///< mail id obtained by \ref osMailCreate
       osMessageQId       message_id;   ///< message id obtained by \ref osMessageCreate
   } def;                               ///< event definition
} osEvent;

zfz9232 发表于 2018-8-29 08:41:13

feixiang20 发表于 2018-8-29 02:40
是代码使用问题吗。。。
使能消息队列相关的函数
#define osFeature_MessageQ   1


我传递的是结构体指针。

zfz9232 发表于 2018-8-29 11:21:09

zfz9232 发表于 2018-8-29 08:41
我传递的是结构体指针。

//定义了结构体
typedef enum
{
        KeyOn                                   = 1,
        KeyOff                                        = 2
}E_KeyPressed;

typedef enum
{
        Key_NULL =0,
        Key_X = 1,
        Key_Y,
        Key_SpeedUp,
        Key_SpeedDown,
        Key_C,
        Key_D,
        Key_E,
        Key_F,
        Key_Back,
        Key_OK,
}E_KeyName;

typedef struct
{
        E_KeyName KeyName;
        E_KeyPressed KeyOnOFF;
}T_KeyPressState;
//
osMessageQId xQueueKeyExtiHandle;
/* definition and creation of xQueueKeyExti */
osMessageQDef(xQueueKeyExti, 32, T_KeyPressState);
xQueueKeyExtiHandle = osMessageCreate(osMessageQ(xQueueKeyExti), NULL);
//
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
       
        KeyState.KeyOnOFF = Key_ReadState(KEY_GPIO,GPIO_Pin);
        if(KeyState.KeyOnOFF == KeyOn)
        {
                printf("on");
        }
        else
        {
                printf("off");
        }
        switch(GPIO_Pin)
        {
                case GPIO_KEY_X:
                        KeyState.KeyName =Key_X;
                        break;
                case GPIO_KEY_Y:
                        KeyState.KeyName =Key_Y;
                        break;
                case GPIO_KEY_A:
                        //speed up
                        KeyState.KeyName =Key_SpeedUp;
                        break;
                case GPIO_KEY_B:
                        //speed down
                        KeyState.KeyName =Key_SpeedDown;
                        //printf("B");
                        break;
                case GPIO_KEY_C:
                        KeyState.KeyName =Key_C;
                        //printf("C");
                        break;
                case GPIO_KEY_D:
                        KeyState.KeyName =Key_D;
                        //printf("D");
                        break;
                case GPIO_KEY_E:
                        KeyState.KeyName =Key_E;
                        //printf("E");
                        break;
                case GPIO_KEY_F:
                        KeyState.KeyName =Key_F;
                        //printf("F");
                        break;
                case GPIO_KEY_G:
                        KeyState.KeyName =Key_Back;
                        //back
                        //printf("G");
                        break;
                case GPIO_KEY_H:
                        KeyState.KeyName =Key_OK;
                        //enter or OK
                        //printf("H");
                        break;
        }
        osMessagePut(xQueueKeyExtiHandle,(uint32_t)&KeyState,osWaitForever);
}
//

void vTaskDealKeyEvent(void const * argument)
{
/* USER CODE BEGIN vTaskDealKeyEvent */
/* Infinite loop */
        osEvent KeyEvent;
        T_KeyPressState *KeyState;
        for(;;)
        {
                osDelay(100);
                KeyEvent = osMessageGet(xQueueKeyExtiHandle,100);
                if(KeyEvent.status == osEventMessage)
                {
                        KeyState = KeyEvent.value.p;
                        if(KeyState->KeyName == Key_Back)
                        {
                                printf("BACK");
                        }
                        if(KeyState->KeyOnOFF == KeyOn)
                        {
                                printf("KeyON");
                        }
                        if(KeyState->KeyOnOFF == KeyOff)
                        {
                                printf("KeyOFF");
                        }
                }
        }
}

zfz9232 发表于 2018-8-29 11:23:35

现象:
如果在TASK与TASK间发送消息,是可以很顺利接收的。
如果在GPIOEXTI的回调函数中,消息是可以接收到,但是内容永远是空的。
想调试进去队列看看什么情况,表示不知道怎么看才好。

zfz9232 发表于 2018-8-29 14:22:40

问题找到了:
我试过在变量前面加volatile ,结果还是无效。
最后我在keil中在 <options for target xxx> --> <c/c++> --> 勾选<Enum container always int>
然后世界一切都那么美好。

zfz9232 发表于 2018-8-29 14:23:10

zfz9232 发表于 2018-8-29 14:22
问题找到了:
我试过在变量前面加volatile ,结果还是无效。
最后我在keil中在-->--> 勾选


这个谁能帮忙解释一下?
页: [1]
查看完整版本: freeRTOS+Keil调试问题。