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/EK-TM4C123GXL:TI.SYSBIOS.family.ARM.m3/Hwi 异常

Guru**** 2601985 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/746771/rtos-ek-tm4c123gxl-ti-sysbios-family-arm-m3-hwi-exception

器件型号:EK-TM4C123GXL
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

大家好、

我已经开始使用 TI RTOS 在 TivaC123GXL 上进行开发、我遇到了问题、希望您能找到解决方案。

我创建了一个写入 i2c 从设备的任务,它工作正常。此后,我在 PF4上创建了 GPIO 中断,以便在发生中断时通知任务写入 i2c 从设备,然后我在 CCS 控制台中收到了以下消息:

正在等待 i2c 中断..
正在等待 i2c 中断..
正在等待 i2c 中断..
正在等待 i2c 中断..
发送
TI.SYSBIOS.family.ARM.m3/Hwi:第1277行:E_noIsr:ID = 85、PC = 00005a44
在 PC = 0x00005a44的后台线程中发生异常。
内核0:ThreadType_Task 中发生异常。
任务名称:{unknown-instance-name}、句柄:0x20001a10。
任务堆栈基地址:0x20000360。
任务堆栈大小:0x800。
R0 = 0x00000000 R8 = 0x00000001
R1 = 0x00006d79 R9 = 0x00000008
R2 = 0x20000ab4 R10 = 0x00000008
R3 = 0x00000001 R11 = 0x20001eb0
R4 = 0x20001d60 R12 = 0x00000000
R5=0x000000f8 SP (R13)=0x20000a70
R6 = 0x00000000 LR (R14)= 0x00005a95
R7 = 0x20000ab4 PC (R15)= 0x00005a44
PSR = 0x61000000
ICSR = 0x00423855
MMFSR = 0x00
BFSR = 0x00
UFSR = 0x0000
HFSR = 0x00000000
DFSR = 0x0000000b
MMAR = 0xe000ed34
BFAR = 0xe000ed38
AFSR = 0x00000000
正在终止执行...

当我通过按下链接到 PF4的用户按钮来实现中断时、任务正在等待中断、出现上述消息。

当我单独测试中断时、通过对任务进行注释、它可以正常工作。

因此,结论:任务本身就可以正常工作,中断本身就可以正常工作,但当我使用任务和中断时,我会收到上面的消息:

以下是我的代码:

/*
*版权所有(c) 2015、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*

/*
*==== empty_min.c ====
*
/* XDCtools 头文件*/
#include
#include
/* BIOS 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include

/*板头文件*/
#include "Board.h"
#include
#include
#include

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"

#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"
#include

#define my_task2_stack_size 2048

Task_StructmyTask2;
Task_Params myTask2Params;
char myTask2Stack[my_task2_stack_size];
INT = 0;

void DRI_vidExtractTouchInfos (void)

uint8_t writeBuffer[3];
I2C_Handle 句柄;
I2C_Params i2cparams;
I2C_Transaction i2c;

I2C_Params_init (&i2cparams);
i2cparams.bitrate = I2C_100kHz;
句柄= I2C_open (EK_TM4C123GXL_I2C3、&i2cparams);
if (handle == NULL){
system_abort ("I2C was not opened");

while (1)

printf("正在等待 i2c 中断..) \n");
如果(IS = 1)

I2C.slaveAddress = Board_TPL0401_ADDR;
I2C.ReadCount = 0;
I2C.readBuf =空;
I2C.writeBuf = writeBuffer;

/*启用 PWM 振荡器*/
writeBuffer[0]= 0x00;
writeBuffer[1]= 0x81;
I2C.writeCount = 2;
printf ("将发送\n");
if (!I2C_transfer (handle、&i2c)){
GPIO_WRITE (Board_LED1、Board_LED_ON);
system_abort (" I2C 传输错误! 在这里");

/*将 LED 置于 PWM 模式*/
writeBuffer[0]= 0x8C;
writeBuffer[1]= 0xAA;
writeBuffer[2]= 0xAA;
I2C.writeCount = 3;
if (!I2C_transfer (handle、&i2c)){
GPIO_WRITE (Board_LED1、Board_LED_ON);
system_abort ("错误的 I2C 传输!");

= 0;

Task_sleep (100);


void gpioButtonFxn0 (void)

/*清除 GPIO 中断并切换 LED */

GPIO_TOGGLE (Board_LED0);
GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_4);
IS = 1;


int main (空)


Board_initGeneral();
Board_initGPIO();
Board_initI2C();

//将时钟设置为80MHz
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlDelay (5);

GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);

GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);

GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE);

GPIOIntRegister (GPIO_PORTF_BASE、gpioButtonFxn0);
GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_4);

/*此任务等待触摸屏事件*/
Task_Params_init (&myTask2Params);
myTask2Params.STACKSIZE = my_task2_stack_size;
myTask2Params.stack = myTask2Stack;
myTask2Params.priority = 3;
Task_construct(&myTask2,(Task_funcPTR) DRI_vidExtractTouchInfos,&myTask2Params, NULL );

/*启动 BIOS */


BIOS_start();


返回(0);

这是我的内存部分配置:

存储器

闪存(RX):origin = 0x00000000,length = 0x00040000
SRAM (rwx):origin = 0x20000000,length = 0x00008000

/*内存中的段分配*/

部分

.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
.vtable:> SRAM

非常感谢您的帮助

此致、  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我想您想在这个上使用信标。 在 Hwi gpioButtonFxn0中,您将调用 semaphore_post (),而在 while (1)中,在 DRI_vidExtractTouchInfos 中,您将调用 semaphore_pend ()。 在调用 semaphore_pend()后,除非它从 gpioButtonFxn0接收到一个信号量句柄,否则任务不会进一步执行。

    有关信标用法的详细信息、请转至以下用户指南中的第8章。
    training.ti.com/.../TI_RTOS_Kernel_Workshop_Student_Guide_rev4.00.pdf

    此网页中提供了一线 TI-RTOS 培训。
    training.ti.com/ti-rtos-workshop-series-1-10-welcome
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    感谢您的回答。

    我使用了信标、但仍然有相同的问题。

    以下是我的新代码:


    /*
    *版权所有(c) 2015、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *

    /*
    *==== empty_min.c ====
    *
    /* XDCtools 头文件*/
    #include
    #include
    /* BIOS 头文件*/
    #include
    #include
    /* TI-RTOS 头文件*/
    #include





    /*板头文件*/
    #include "Board.h"
    #include
    #include
    #include

    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_gpio.h"

    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/interrupt.h"
    #include
    #include



    ERROR_Block EB;


    Semaphore_handle sem;

    #define my_task2_stack_size 2048

    Task_StructmyTask2;
    Task_Params myTask2Params;
    uint8_t myTask2Stack[my_task2_stack_size];
    INT = 0;

    void DRI_vidExtractTouchInfos (void)



    uint8_t writeBuffer[3];
    I2C_Handle 句柄;
    I2C_Params i2cparams;
    I2C_Transaction i2c;

    I2C_Params_init (&i2cparams);
    i2cparams.bitrate = I2C_100kHz;
    句柄= I2C_open (EK_TM4C123GXL_I2C3、&i2cparams);
    if (handle == NULL){
    system_abort ("I2C was not opened");



    while (1)

    printf("正在等待 i2c 中断..) \n");
    Semaphore_pend (sem、BIOS_wait_forever);
    //if (is = 1)


    //printf ("写入 i2c \n");
    I2C.slaveAddress = Board_TPL0401_ADDR;
    I2C.ReadCount = 0;
    I2C.readBuf =空;
    I2C.writeBuf = writeBuffer;

    /*启用 PWM 振荡器*/
    writeBuffer[0]= 0x00;
    writeBuffer[1]= 0x81;
    I2C.writeCount = 2;
    printf ("将发送\n");
    if (!I2C_transfer (handle、&i2c)){
    GPIO_WRITE (Board_LED1、Board_LED_ON);
    system_abort (" I2C 传输错误! 在这里");


    ////
    //// /*将 LED 置于 PWM 模式*/
    //// writeBuffer[0]= 0x8C;
    //// writeBuffer[1]= 0xAA;
    //// writeBuffer[2]= 0xAA;
    //// I2C.writeCount = 3;
    //// if (!I2C_transfer (handle、&i2c)){
    //// GPIO_WRITE (Board_LED1、Board_LED_ON);
    //// system_abort ("错误的 I2C 传输!");
    ////}
    ////
    = 0;

    Task_sleep (100);











    void gpioButtonFxn0 (void)

    /*清除 GPIO 中断并切换 LED */

    //GPIO_TOGGLE (Board_LED0);

    // is = 1;
    Semaphore_post (SEM);
    GPIOIntClear (GPIO_PORTF_BASE、GPIO_INT_PIN_4);


    int main (空)


    ERROR_INIT (&EB);

    SEM = Semaphore_create (0、NULL、&EB);
    if (sem == NULL){
    system_abort ("信标创建失败");


    Board_initGeneral();
    Board_initGPIO();
    Board_initI2C();

    //将时钟设置为80MHz
    SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    SysCtlDelay (5);

    GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);
    GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);

    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);

    GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_FALLING_EDGE);

    GPIOIntRegister (GPIO_PORTF_BASE、gpioButtonFxn0);
    GPIOIntEnable (GPIO_PORTF_BASE、GPIO_INT_PIN_4);



    /*此任务等待触摸屏事件*/
    Task_Params_init (&myTask2Params);
    myTask2Params.STACKSIZE = my_task2_stack_size;
    myTask2Params.stack = myTask2Stack;
    myTask2Params.priority = 3;
    Task_construct(&myTask2,(Task_funcPTR) DRI_vidExtractTouchInfos,&myTask2Params, NULL );



    /*启动 BIOS */


    BIOS_start();




    返回(0);






    相同的错误信息,它就像内存损坏或错误的指针,或者类似的...

    正在等待 i2c 中断..
    发送
    TI.SYSBIOS.family.ARM.m3/Hwi:第1277行:E_noIsr:ID = 85、PC = 00005a00
    在 PC = 0x00005a00的后台线程中发生异常。
    内核0:ThreadType_Task 中发生异常。
    任务名称:{unknown-instance-name}、句柄:0x20001a10。
    任务堆栈基地址:0x20000360。
    任务堆栈大小:0x800。
    R0 = 0x00000000 R8 = 0x00000001
    R1 = 0x00006d39 R9 = 0x00000008
    R2 = 0x20000ab4 R10 = 0x00000008
    R3 = 0x00000001 R11 = 0x20001e64
    R4 = 0x20001d14 R12 = 0x00000000
    R5=0x000000f8 SP (R13)=0x20000a70
    R6 = 0x00000000 LR (R14)= 0x00005a45
    R7 = 0x20000ab4 PC (R15)= 0x00005a00
    PSR = 0x61000000
    ICSR = 0x00423855
    MMFSR = 0x00
    BFSR = 0x00
    UFSR = 0x0000
    HFSR = 0x00000000
    DFSR = 0x0000000b
    MMAR = 0xe000ed34
    BFAR = 0xe000ed38
    AFSR = 0x00000000
    正在终止执行...



    此致、

    Nabil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请勿使用 printf、因为它可能需要大量的堆栈大小。 请尝试改用 System_printf。 您还可以使用 ROV 来查看是否存在栈大小溢出问题。

    示例如下:

    system_printf ("启动示例\n 系统提供程序设置为 SysMin。 "
    "停止目标以查看 ROV 中的任何 SysMin 内容。\n");

    /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
    system_flush();


    有关使用 printf 的提示、请参见此链接。
    processors.wiki.ti.com/.../Tips_for_using_printf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Charles 的反应、

    我之前已删除 printf、但遗憾的是、我始终遇到相同的问题。

    此致

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

    您好!

     发生了一个 HWI 异常、该异常可能是由于堆栈溢出、没有堆或由于非法指令执行(由于错误的指针)。

    我建议您按照前面的建议增加运行时堆栈大小和任务堆栈大小。  

    此外、您还可以查看 ROV 以了解有助于调试问题的信息。 在 ROV 中、您能否检查 Hwi、任务和堆模块? 检查堆栈/堆大小、异常跟踪。

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

    您好、再说一次、

    我应用了你的建议。

    下面是有关我的任务以及如何在 ROV 中执行的一些屏幕截图:

    仍然存在相同 的问题。

    此致、  

    Nabil、

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

    请不要将 GPIOIntRegister 与 TI-RTOS 一起使用。 有关详细信息、请查看: e2e.ti.com/.../2347913 (特别是该主题的最后一篇文章)。

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

    ToddMullanix 您好、  

    感谢您的帮助、这让人感觉很好。


    谢谢大家。

    此致、

    Nabil