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

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