你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
feixiang20 发表于 2018-8-29 02:40 是代码使用问题吗。。。 使能消息队列相关的函数 #define osFeature_MessageQ 1
zfz9232 发表于 2018-8-29 08:41 我传递的是结构体指针。
查看全部评分
zfz9232 发表于 2018-8-29 14:22 问题找到了: 我试过在变量前面加volatile ,结果还是无效。 最后我在keil中在 --> --> 勾选
使能消息队列相关的函数
#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;
我传递的是结构体指针。
//定义了结构体
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");
}
}
}
}
如果在TASK与TASK间发送消息,是可以很顺利接收的。
如果在GPIOEXTI的回调函数中,消息是可以接收到,但是内容永远是空的。
想调试进去队列看看什么情况,表示不知道怎么看才好。
我试过在变量前面加volatile ,结果还是无效。
最后我在keil中在 <options for target xxx> --> <c/c++> --> 勾选<Enum container always int>
然后世界一切都那么美好。
评分
查看全部评分
这个谁能帮忙解释一下?