STM32
直播中

徐胤

7年用户 1066经验值
私信 关注
[问答]

emwin发布信号量给ucos的其他任务失败的原因?

   OS_ERR      err;
(void)p_arg;
MainTask();
while(DEF_TRUE)
{                GUI_Exec();                        /
/ MainTask();
OStimeDlyHMSM(0, 0, 1, 0,                      OS_OPT_TIME_HMSM_STRICT,                       err);                }

这是emwin的主界面代码        
while(DEF_TRUE)
                {  
                        OSTaskSemPend(0, OS_OPT_PEND_BLOCKING,p_ts, err);
                        //Test();
                         GPIOG->ODR^=GPIO_Pin_13;
                    OSTimeDlyHMSM(0, 0, 2, 0,
                      OS_OPT_TIME_HMSM_STRICT,
                       err);
                }

这是等待任务的代码

case GUI_ID_ICONVIEW0:
{                                                                    
                                        switch (NCode)
                                        {
                                        case WM_NOTIFICATION_RELEASED:

                                                sel = ICONVIEW_GetSel(hItem);                 //浠?浣嶅熀鍑?
                                                switch (sel)
                                                {
                                                        case 0:                                      //相机
                                                        {
                                                                  OSTaskSemPost( COM_TaskTCB, OS_OPT_POST_NONE, err);
                                                        } break;
这个是emwin回调函数的部分代码,下载之后直接进入硬件中断,如果没有任务等待这个信号就不会,实在不知道为什么会这样,请大家帮忙看看,是哪里没有设置什么吗?ucos iii是参照官方的历程移植的,谢谢


回帖(1)

靓仔峰

2024-5-11 17:21:38
在您提供的代码片段中,我注意到您正在尝试在uCOS中发布信号量,但是遇到了一些问题。根据您提供的信息,错误代码是 OS_ERR。这通常表示在执行操作时发生了错误。在这种情况下,可能是发布信号量时出现了问题。

以下是可能导致发布信号量失败的一些原因:

1. 信号量未正确初始化:在发布信号量之前,您需要确保信号量已经正确初始化。使用 OSSemCreate() 或 OSSemCreateExt() 函数创建信号量,并确保传递了正确的参数。

2. 信号量已被删除:如果信号量已经被删除,尝试发布信号量将导致错误。确保在发布信号量之前,信号量仍然存在。

3. 信号量的优先级设置不正确:在使用信号量时,需要确保任务的优先级高于或等于信号量的优先级。如果任务的优先级低于信号量的优先级,发布信号量将失败。

4. 信号量计数器达到最大值:信号量的计数器有一个最大值,通常为 65535。如果尝试发布一个已经达到最大计数器值的信号量,将导致错误。

5. 信号量被锁定:如果信号量已经被锁定,尝试发布信号量将失败。确保在发布信号量之前,信号量没有被锁定。

为了解决这个问题,您可以尝试以下步骤:

1. 确保信号量已正确初始化,并且没有被删除。
2. 检查任务的优先级是否高于或等于信号量的优先级。
3. 确保信号量的计数器没有达到最大值。
4. 确保信号量没有被锁定。

此外,您提供的代码片段中有一些语法错误,例如多余的空格和缺少分号。请确保您的代码格式正确,以便编译器可以正确解析。

修正后的代码示例:

```c
(void)p_arg;
MainTask();
while(DEF_TRUE) {
    GUI_Exec();
    OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
    if (err != OS_ERR_NONE) {
        // 处理错误
    }
}
```

请检查您的代码,确保遵循了上述建议,并尝试重新编译和运行程序。如果问题仍然存在,请提供更多关于您的应用程序和信号量使用的详细信息,以便进一步分析和解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分