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

freeRTOS+Keil调试问题。

[复制链接]
zfz9232 提问时间:2018-8-28 15:14 /
各位:最近使用FreeRTOS的时候,在GPIO口中断回调中调用了osMessagePut,用任务接这个消息。
结果发现消息是接到了,但是里面的值一直是0.

1、有谁知道这个原因

2、我想进这个消息队列中看看,但是keil貌似不给看,是我打开方式出错了?谁知道?
收藏 评论6 发布时间:2018-8-28 15:14

举报

6个回答
feixiang20 回答时间:2018-8-29 02:40:50
是代码使用问题吗。。。
使能消息队列相关的函数
#define osFeature_MessageQ   1
定义消息队列的名字
osMessageQDef(MsgBox, 1, int); //创建一个长度为1,单位为int的消息队列
osMessageQId  MsgBox;               //消息队列的ID  
创建队列
MsgBox = osMessageCreate(osMessageQ(MsgBox), NULL);
//穿件消息队列
向队列发送消息
osMessagePut(MsgBox, 1, osWaitForever);
注:1、这个函数实现向消息队列传送一个int数据1、并且进程一直阻塞知道
从队列接收消息
osEvent  evt;
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>
然后世界一切都那么美好。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

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

这个谁能帮忙解释一下?

所属标签

相似问题

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