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/LAUNCHXL-CC26X2R1:信号量放置和配置

Guru**** 2540720 points
Other Parts Discussed in Thread: AFE4404, CC2640

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/760324/rtos-launchxl-cc26x2r1-semaphore-placement-and-configuration

器件型号:LAUNCHXL-CC26X2R1
主题中讨论的其他器件:AFE4404CC2640

工具/软件:TI-RTOS

尊敬的 TI 专家:

我目前正在从事一个项目、涉及一个与 AFE4404、ADXL345和 microSD 卡插槽集成的 CC26x2芯片。  该项目是之前使用 CC2640的电路板的延续。 最后一个编译存在一些线程问题、我希望确保在这个新编译中避免这些问题。  下面是有关设备工作原理的一些背景信息:

Sensor Controller Studio (SCS)从 AFE4404收集14个样本、然后通过设置为400KHz 的 I2C 从 ADXL345收集1个样本(x、y、z)。 此过程将持续到  SCS 中的内部缓冲器生成警报以唤醒 cc26x2并清空 SCS 缓冲器。 任务1持续检查 SCS 中断、当检测到一个中断时 、将接收输出的 SCS 缓冲器、 然后任务1将其解析为单个样本。 然后、任务1将这些样本发送到乒乓缓冲器。  此任务1的一般结构如下所示:

初始化 AFE、UART、I2C、SPI、ADXL345、 MicroSD (FATFS)、引脚、内存/缓冲器和 SCS。
Semaphore_Params semParams;
Semaphore_Params_init (&semParams);
Semaphore_construction (&semMainLoop、0、&semParams);
hSemMainLoop = semaphore_handle (&semMainLoop);
scifClearAlertIntSource ();
while (1)
{
检查同步
semaphore_pend 的时间(hSemMainLoop、BIOS_WAIT_Forever);
scifAlertIntSource ();
检查 SCS cfg 变量以查看 SCS 缓冲区的完整程度。
如果 cfg 变量指示已满或几乎已满、则清空缓冲区。
ScifAckAlertEvents ();
} 

 

当其中一个乒乓缓冲器接近满状态时、会发布一个信标、并使用任务2通过 SPI 将乒乓缓冲器数据写入 microSD 卡。 任务2的总体结构如下所示:

Semaphore_Params semParams2;
Semaphore_Params_init (&semParams2);
Semaphore_construction (&semWriteSD、0、&semParams2);
hSemWriteSD = Semaphore_handle (&semWriteSD);
while (1)
{
Semaphore_pend (hSemWriteSD、BIOS_wait_forever);
writeToSD ();
} 

 此外,在调用 BIOS_Start()之前启动一个周期性时钟实例,并且大约每11秒触发一次。 触发后、变量设置为 true、在下一次将数据写入 SD 卡期间、会发生 f_sync 操作。  

 


一些问题:

1.这种方法是否正确?  

2.根据文档,信标默认为计数。  对于我所概述的任务、这是一个好的设置吗?

3.是否应该为所提到的信标设置优先级?  如果是、您如何确定哪一项最适合优先级?

 

谢谢!

斯蒂芬

 

 

 

 

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

    在论坛上发布代码时、请使用标记的代码格式工具 按钮。 这使得代码易于阅读、并可帮助您在论坛上更快地获得支持。

    如何将 hSemMainLoop 和 hSemWriteSD 发布到? 由谁来决定?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您提供有关发布代码的信息、我对最后一个帖子的格式表示歉意。

    hSemMainLoop 由以下代码在任务1中发布:

     

    scifOsalInit();
    scifOsalRegisterTaskAlertCallback (scTaskAlertCallback);
    scifInit(&scifDriverSetup); 

    void scTaskAlertCallback (void)
    {
    Semaphore_post (hSemMainLoop);
    }
    

     

    半 WriteSD 也由以下代码在任务1的上下文中发布:

    void postSemToWrite()
    {
    Semaphore_post (hSemWriteSD);
    } 

    此外,这是调用 BIOS_start()之前的任务设置:

    Task_Params taskParams;
    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = MAIN_TASK_STACK_SIZE;
    taskParams.stack =维护任务堆栈(&M);
    taskParams.priority = 1;
    Task_construct(&MainTaskStruct,(Task_Functr)MainTask,&taskParams,NULL );
    
    Task_Params writeSDtaskParams;
    Task_Params_init (&writeSDtaskParams);
    writeSDtaskParams.STACKSIZE = WRITESD_STACK_SIZE;
    writeSDtaskParams.stack = WriteSDTaskStack;
    writeSDtaskParams.priority = 1;
    Task_construction (&WriteSDTaskStruct、(Task_FuncPtr) WriteSDTask、&writeSDtaskParams、NULL);
    
    Clock_Params clkParams;
    Clock_Params_init (clkParams);
    clkParams.period =(5 * 60 * 1000000)/Clock_tickPeriod;
    clkParams.startFlag = true;
    //构造周期性时钟实例
    Clock_con构(&clk0Struct,(Clock_Functr) clk0Fxn、
    (5 * 60 * 1000000)/Clock_tickPeriod、clkParams); 

    谢谢
    斯蒂芬




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1)它似乎足够合理。 但是、如果两个任务都具有相同的优先级、我想说明为什么要执行任务、MainTask 和 WriteSDTask? 它们彼此"相互依赖",这意味着 WriteSDTask 仅在 MainTask 调用 postSemToWrite()时执行它的操作。 我认为这两个任务都可以是一个运行事件驱动状态机的任务(请看 SYS/BIOS 事件)。 使用时钟信号 f_sync 是可以的。
    2) 2)计数信标可能正常。 但是、如果你希望我具有语义、你会像使用二进制信标一样使用它们。 不是因为它会在这个特定的设置中产生很大的影响、但将来可能会避免错误。
    3) 3)在您的设置中、优先级信标不需要。