This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TMS570LS3137:CAN#39;t "take "FreeRTOS 中的信号量

Guru**** 1797640 points
Other Parts Discussed in Thread: HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/575374/rtos-tms570ls3137-can-t-take-a-semaphore-in-freertos

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

工具/软件:TI-RTOS

我一直在 FreeRTOS 中处理任务、尝试处理通知事件和事件组-我让这两个事件都能正常工作(如果我将呼叫括起来使其具有特权、通知功能就能正常工作)-我发现事件组看起来比通知更快、这让我感到惊讶。  后来、我一直在尝试使用二进制信标、但没有成功。  具体而言、我似乎无法"获取"信标-我看到它们实际上是作为队列实现的。  我已经把它归结为这个简单的示例程序、它在尝试获取信标的"发件人任务"时卡住了:

/**@file sys_main.c
*@简要应用程序主文件
*@日期2016年3月2日
*@版本04.05.02
*
*此文件包含一个空的主函数
*,可用于应用程序。
*/

*
版权所有(C) 2009-2016 Texas Instruments Incorporated - www.ti.com
*
。
*。
*。
*
*/


/*用户代码开始(0)*/

/*用户代码结束*/

/*包含文件*/

#include "sys_common.h"

//*用户代码开始(1)*/
#include 
#include 
#include "os_task.h"
#include "os_semphr.h"

//*用户代码结束*/


*用户代码开始(2)*/


int receiver task_can_run = 0;

SemaphoreHandle_t start_semaphore = 0;
SemaphoreHandle_t stop_semaphore = 0;

void sender_task_take





={* semaphore_return =
200 semaphore_semaphore_se_se_se_se_sprue_se_sepdore = 0;semaphore_semaphore_return =* semaphore_se_semaphore_se_se_se_se_se_se_se_se_se_semaphore= 200 semaphore= void = 1 (
如果(pdFALSE == semaphore_take 返回) printf ("发件人线程无法获取起始信标\n");
否则 printf ("发件人采用 start_semaphore\n");
};

receiver_task_can_run = 1;

while (1){void



* receiver_task_task (void * semaphore)
=





0;task_task_task = 0;task_task_turb 前面

的 void = 0;void * task = void 1;task_task = veage_task = veole/ task (void);task = veage_task = veforeet t

while (1 = keepGoing){
//
BaseType_t xRunning= prvRaisePrivilege ();
Semaphore_take = pdFALSE;
while (pdsemaphore_te_return = pdFALSE){
semaphore_take = xSemaphoreTake (start_semaphore、2000);'take
= pdsemaphore');'teneetrentrecte'(如果没有特权
、则为"printf_return"}f);senore_take senore_take = xSemaphore (f);ture"(如果没有特权、则为 f);tenetrentrecte




}/*



用户代码结束*/

void main (void)
{
/*用户代码开始(3)*/
BaseType_t xReturned;

PUT ("这是一个测试\n\r");

start_semaphore = xSemaphoreCreateBinary ();
stop_semaphore = xSemaphoreCreateBinary ();

xReturned = xTaskCreate (sender_task、(const char*)"sender_task"、350、NULL、 1、NULL);
printf ("发送器 xReturned:0x%x\n"、xReturned);

xReturned = xTaskCreate (receiver_task、(const char*)"receiver_task"、 300、NULL、1、NULL);
printf ("接收器 xReturned:0x%x\n"、xReturned);


vTaskStartScheduler();

/*用户代码结束*/
}

/*用户代码开始(4)*/
//用户代码结束*/

这对我来说并不是超级关键、因为我有活动组和通知在工作、但我想知道为什么这不起作用。  我使用的是 Halcogen 04.05.02和 CCS 6.2.0.00048

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Thomas:

    我看不到你在哪里提供信号量。

    在从信标获取之前、您需要将信标分配给信标。 信标的作用类似于计数器(二进制信标的最大计数为1)。 当你给信标时、你增加计数器。 当你从信标中获取时、你会减小计数器。 如果计数器到达0、并且您尝试获取、您将等待一些任务将提供给信标。

    另一件事是、你从两个任务中的同一个信标中获取。 这可能会导致意外行为。

    此致、

    米歇尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Thomas:

    我已通知我们的一位 FreeRTOS 专家、他们可能会提供帮助。 他们很快就会回来。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢米歇尔,我以为我已经尝试过,但显然没有(!)。  出于某种原因、我认为它正好相反、但现在意识到它在文档中显示了这一点:  

    "信号量是在'empty'状态下创建的,这意味着信号量必须首先使用 xSemaphoreGive() API 函数给出,然后才能使用 xSemaphoreTake()函数获取(获取)。"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Thomas:

    如果这解决了您的问题、您能否将 Michel 的答案标记为已验证、以便关闭该主题。