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/CC2640R2F:实现中断信号量的完整过程

Guru**** 2611705 points
Other Parts Discussed in Thread: CC2650, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/580945/rtos-cc2640r2f-the-complete-procedure-to-implement-a-semaphore-to-an-interrupt

器件型号:CC2640R2F
Thread 中讨论的其他器件:CC2650SYSBIOS

工具/软件:TI-RTOS

尊敬的先生/女士:

我正在使用信号量为 CC2640R2项目开发按钮功能。  我使用的是 CC2640R2 LAUNCHXL 开发板。

我的 button.c 代码基于 sensortag_keys.c 代码。  

但是,我是否可以知道为什么当我 输入 Semaphore_pend (ButtonSemaphore、BIOS_WAIT_Forever)时, 我的按钮中断将不起作用。

如果没有 Semaphore_pend (ButtonSemaphore、BIOS_Wait_Forever);在我的静态 void button_TaskFxn (UArg0、UArg1)中、我的中断将起作用。

这意味着,当按下按钮时,程序将转至回叫函数 --> void button__Callback (PIN_Handle handle,PIN_ID pinId)。

这在 PIN_registerIntCb (ButtonInteruptPinHandle、button_Callback)中进行初始化。

以下是我的代码:

int main()

{

.

。

。

。

。



/*[KF]添加用于调试的按钮任务*/

button_CreateTask();



//启用中断并启动 SYS/BIOS */

BIOS_start();



返回0;

}







void button_taskTask (void)

{

Task_Params Params;



Task_Params_init (&CreateParams);

taskParams.stack = ButtonTask_params.stack



= Button_params.stack;task_params.stack = Button_params.stack;task_params.stack = Task_size_task_params.task_params.stack;task.



Task_construct(&ButtonTask, button_TaskFxn,&taskParams, NULL);

}





静态空 button_TaskFxn (UArg0,UArg1)

{

uint8_t debugButton2;

/*{KF] Initialize Button */

button_Init();



//应用程序主循环

对于(;)

{

uint32_t 事件;



Semaphore_pend (ButtonSemaphore、BIOS_WAIT_Forever);



debugButton2 = debugButton2 +1;

}

}





void button_Init (void)

{

button__reset ();



ButtonInteruptPinHandle = PIN_OPEN (&ButtonGpioState、ButtonPinTable);

PIN_registerIntCb (ButtonInteruptPinHandle、button_Callback);



Util_constructClock (周期时钟、button_clockHandler、

100、1000、false、0);

}





void button__Callback (PIN_Handle handle、PIN_ID pinId)

{

switch (pinId)

{



案例 Board_BTN2:

button__processKeyRight();

中断;



默认值:

/*不执行任何操作*/

break;

}







}void button__processKeyRight (void)

{

uint8_t debugButton;



if (PIN_getInputValue (Board_key_right))

{

按键&=~SK_KEY_RIGHT;

}

其他

{

键|= SK_KEY_RIGHT;

}



Semaphore_post (ButtonSemaphore);



debugRbutton = debugRbutton + debugRbutton;

}


按下按钮时、程序不会使 button__processKeyRight (void)无效以处理其数据。

请提供建议。

非常感谢。

谢谢、

KF

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢我的朋友。 问题得到解决。 我错过了创建信标函数。 它现在在创建信标后工作。
    但是,我是否知道如何设置最大信标计数值?

    感谢你的建议。

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

    您好!

    您无法在 TI-RTOS 中设置信号量的最大值。 最大值设置为65535。 如果信标计数增加到超过最大值、则 AM 溢出错误(Semaphore_a_overflow assert)将增大。

    最好的解决方案是使用 Semaphore_getCount 来检查在发布到信标之前是否已达到 maxminum。

    您可以在 Resource Explorer 中(在 CCS 中的 View 菜单下、或在下面的在线地址处)查看信标的完整文档

    文档也存储在您的计算机上(资源管理器指向这些文件的链接),位于以下文件夹中:  

    C:\ \doc\

    打开文档概述 html 页面并单击以下链接:

    TI-RTOS 内核运行时 API 和配置(CDOC)

    在 Resource Explorer 中、可以通过以下路径获取相同的页面:

    Software->TI-RTOS for CC2650 xxx -> Documents -> Documentation 链接-> Kernel Documation

    在 API 页面的左侧菜单中、您必须遵循以下路径:

    TI -> SYSBIOS -> KNL ->信标

    您能否单击"验证答案"以获取您的答案或我的答案? 这可能会帮助他人找到解决其问题的方法。

    此致、

    米歇尔

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

    您好、Michel、

    非常感谢您的回复。

    是的、您有一个好主意。  我将使用 Semaphore_getCount 来获得剩余的当前信标计数。

    此外、我还需要您对我的项目的帮助。  

    目前、我正在为单按钮(消抖必须具有)开发一个程序、该程序具有单次短按、双次短按、长按、非常长按和非常长按。

    要求之一是使用 util.c 中 的函数作为所使用的定时器。   但是,我 仍在想如何使用 util.c 中的函数 。   我是否可以参考任何简单而清晰的解释?

    我是否可以就流程、如何将 6 个(包括去抖)函数插入 单个按钮(使用中断)向您提出建议?  如果只允许使用1个中断计时器, 如何执行此操作?

    我是否可以知道如何 使用 util.c 创建中断计时器?  

    我已经尝试修改 sensortag_keys.c 并使用驱动程序 timer.c 来执行此操作、但这违反了我们的要求。  

    原因是我们担心 timer.c 中使用的 timer_A 会与 BLE 广播、加速计、PWM、LED 等其他应用程序一起崩溃。。。 等

    该项目 具有许多嵌入的功能。  

    我在 timer.c 中使用 timer_A  我在整个项目中搜索 Timer_A 虽然它只在 iCall 和 timer.h 中出现两次、但我仍有其他应用程序将使用与这个相同的计时器。

    对于 timer.c、 我将把一个计数加载到寄存器中、然后启动它。  在进入计时器中断服务例程之前、它将从0递增计数到我的设置编号。

    但是,我想知道 当程序计数器递增计数时,如何检查每个节拍或计数的时间?  

    如果我使用这个计时器,请问  如何 为  按钮中断服务例程中的每个中断实现去抖功能?  

    请提供建议。

    非常感谢。

    谢谢、

    KF    

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

    您好!

    我不允许您使用时钟模块(它是 TI-RTOS 的一部分)、但它可以解决您的问题。

    以下是它的外观:

    //初始化并创建/控制全局时钟模块,例如:
    clock_StructyClockStruct;
    Clock_handle yourClockHandle;
    
    uint8_t CURRENT_button_state;
    
    //使时钟单次(非周期性)
    Clock_Params yourClockParam
    ;Clock_init (&ClockParams_state);//创建
    时钟周期参数;
    //创建时钟周期为 timeLockParams.param;params = param
    
    Clock_construct(&yourClockStruct,YourClockCallback,yourTimeout,&yourClockParams);
    yourClockHandle = Clock_handle (&yourClockStruct);
    
    
    void YourClockCallback (UArg u0){
    if (/*您的 IO 仍被按下*/){
    //如果需要更新超时期限,请在此处执行以下操作:
    Clock_setTimeout (yourClockHandle、yourNewTimeout);
    
    CURRENT_button_state++;
    
    //在此处重新启动计时器
    Clock_start (yourClockHandle);
    }否则{
    //在此处执行操作
    如果(CURRENT_button_state = 0){
    //非常快按
    } 否则、如果(CURRENT_button_state = 1){
    //短按
    } else // if (…
    //保持列表针对所有事件}
    
    
    
    io_interrupt_callback (...) {
    CURRENT_button_state = 0;
    Clock_start (&yourClockHandle);
    }
    
    

    但愿这对您有所帮助。 遗憾的是、我对传感器标签项目的了解不够、因此无法提供很多帮助。

    如果这符合您的需求、您可以将上述逻辑与上一篇文章中提到的计时器结合使用。

    您也可以在论坛上发布另一个问题、因为这是一个单独的问题。

    此致、

    米歇尔

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

    非常感谢您的想法和回复。
    我允许使用 util.c、它最终将使用时钟模块。
    您的方法既简单又全面。 我将从这里获取它并进行修改。

    非常感谢。

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

    尊敬的先生/女士:

    以下 问题是否可以帮助我?

    我使用以下方法启用中断并注册中断回拨:

    请问如何清除中断标志以及取消注册中断回拨?

    谢谢你。

    谢谢、

    KF

    PIN_Config ButtonPinTable[]=
    {
    BRIDGE_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、
    PIN_TERMINATE
    };
    
    
    void button_INF_StartDetectExtExtExtExtExtExtExtTI (ButtonId buttonId)
    {
    开关(buttonId)
    {
    Case Bridge_BTN1:
    {
    button__reset ();
    ButtonInteruptPinHandle = PIN_OPEN (&ButtonGpioState、ButtonPinTable);
    PIN_registerIntCb (ButtonInteruptPinHandle、button_Inf_InterruptHandler);
    中断;
    }
    
    默认值:
    break;
    }
    
    
    void button_inf__StopDetectExtExtExtExtExteti (ButtonId buttonId)
    {
    开关(buttonId)
    {
    Case Bridge_BTN1:
    {
    PIN_setConfig (ButtonInteruptPinHandle、PIN_IRQ_DIS、Bridge_BTN1 | PIN_IRQ_BOTHEDGES);
    
    /*如何从此处取消注册回拨? *
    /*还有如何清除中断标志。 *
    
    中断;
    }
    默认值:
    中断;
    }
    
    

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

    您好!

    要清除中断标志、必须使用以下函数(可以在 Resource Explorer 文档中找到有关此函数和其他函数的更多信息):

    PIN_Status PIN_clrPendInterrupt (PIN_Handle handle、PIN_ID pinId) 

    为什么需要取消注册回调函数? 仅禁用中断是不够的。

    根据上面的代码、您不会禁用中断。

    请尝试以下操作:

    PIN_setInterruptPinHandle、Bridge_BTN1 | PIN_IRQ_DIS); 

    此致、

    米歇尔

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

    您好、Michel、

    好的、您是对的、我不需要取消注册中断。  

    我可以在下次启用中断时使用中断句柄。  

    好建议、我会 将您的建议纳入我的代码中。

    非常感谢。

    谢谢、

    KF