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/TM4C1294NCPDT:ISR 函数内的 I2C 写入和读取调用

Guru**** 2439710 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/614589/rtos-tm4c1294ncpdt-i2c-write-and-read-call-inside-isr-function

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我在 ISR 函数内调用一个 i2c_write 函数、但它显示了一些错误、如下所示...

Sserion 失败:a_badContext:调用上下文错误。 必须从任务调用。
xdc.runtime.Error.raise:终止执行

/* ISR 函数调用*/

ISRHandlerFunction()

/*完成清除标志和 LED 切换*/

(*(volatile uint32_t *) clearFlagaddr)= bit_shift;
 GPIO_TOGGLE (Board_LED0);

I2cWrite();

/* I2C 写入功能*/

I2cWrite()

uint8_t        vui8Count;


   system_printf ("i2c write\n");
   //System_flush();

   /*创建 I2C 以供使用*/
   I2C_Params_init (&stI2cParams);
   stI2cParams.bitrate = I2C_400kHz;

   stI2cHandle = I2C_open (stI2cConfig->vui8I2cBus、&stI2cParams);
   if (stI2cHandle == NULL){
       System_abort ("初始化 I2C\n 时出错");
   }
   否则{
       system_printf ("I2C 已初始化!\n"\});
   }


   对于(vui8Count = 0;vui8Count <(stI2cConfig->vui8writeCount - 1);vui8Count++){
       if (I2C_transfer (stI2cHandle、&stI2cTransaction)){
           system_printf ("发送数据%d:%d \n"、vui8Count+1、stI2cConfig->pui8txbuffer);
       }
       否则{
           System_printf ("I2C 总线故障\n");
       }

       //System_flush();

   }

   /*已取消初始化 I2C */
   I2C_Close (stI2cHandle);

上面是实际代码、它只是一种代码格式。

如果我对 i2cWrite 函数进行注释、ISR 函数工作正常。 如果我在 ISR 内部使用、它会显示上述错误。

想知道出现此错误的原因。

此致、

Manohar

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

    [引用 USER="Manohar B">我在 ISR 函数内调用一个 i2c_write 函数、但它显示了一些错误、如下所示...

    Sserion 失败:a_badContext:调用上下文错误。 必须从任务[/引用]中调用该错误是因为中断处理程序(SWI 或 HWI)不允许调用阻止的 SYS/BIOS 函数。

    若要消除该错误、请将 i2c_write 代码移动到 一个围绕着 Semaphore_pend()的任务函数中、并让 ISRHandlerFunction 布置阻止该任务的信标。

      有关示例、请参阅 e2e.ti.com/.../376920。

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

    Manohar、

    编译器不会让您继续尝试、或者您的项目开始变得不太可靠、这是一件好事。

    这样想:您希望中断服务例程尽可能短。 它应该在发生硬件中断事件时执行所需的极低的操作。 诸如通过 I2C 写入数据之类的任务可以"稍后"完成。

    非操作系统工程内部的逻辑应该是:在中断内部、设置一个控制标志、该标志表明必须执行 i2CWrite;返回主程序、检查标志并执行已启用的任务。

    使用 TIRTOS 时、概念几乎相同、但更简单-在 ISR 内部、您只需向任务发布信标、操作系统将尽快运行 i2CWrite。

    布鲁诺

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

    即使我发布了一个 SWI 并且在 SWI 函数内部、我也会调用 i2cWrite()函数。 即使我遇到相同的误差。

    /*示例代码*/
    /*HWI 处理程序函数*/
    HWIHandlerFunc()

    //清除标志//
    Swi_Post (SwiHandle);


    /*Swi 处理程序函数*/
    SwhandleFunc()

    while (1)

    Swi_pend (SwiHandle);
    i2cWrite();



    上面的 i2cWrite 函数也会提供相同的错误。 为什么?


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

    [引用 user="Manohar B">即使我发布了 SWI,在 SWI 函数内部也调用 i2cWrite()函数。 尽管我遇到了相同的错误。一个 SWI 受 HWI 同样的限制、因为这两个器件都无法调用阻止的 SYS/BIOS。

    需要在任务中进行 i2cWrite()函数调用,在该任务可以在 SWI 或 HWI 发布的信标上挂起。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    切斯特、
    抱歉、我的海报有误。 刚才更正了我先前的消息、将 SWI 替换为任务。
    布鲁诺