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-TM4C1294XL:TI-RTOS 添加 GPIO 中断:中断引脚、优先级、在上升沿

Guru**** 2453930 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/636480/rtos-ek-tm4c1294xl-ti-rtos-add-gpio-interrupt-interrupt-pins-priority-level-on-rising-edge

器件型号:EK-TM4C1294XL

工具/软件:TI-RTOS

您好!  

我目前正在尝试在端口 P 的引脚3上设置 GPIO 中断、也称为 EK-TM4C1294XL BoosterPack 2上的 PP3。 带有按钮的 GPIO 中断示例工作正常、但一旦我想将按钮更改为 PP3、它将不起作用并进入 load_exit()例程。 一旦 Launchpad 从外部源(例如 Arduino)获取(+5V)信号、就应立即生成中断。 我使用了以下代码

/*安装按钮回调*/
GPIO_setCallback (INT_GPIOP3、gpioButtonFxn0);

/*启用中断*/
GPIO_enableInt (INT_GPIOP3);

此外、中断应具有最高优先级、如何设置优先级?

提前感谢。

Jonas。

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

    除了这些代码段之外、您还可以共享代码来配置整个 GPIO 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*
    === gpiointerrupt.c ====
    //
    
    //* XDCtools 头文件*/
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    #include 
    
    /*示例/板头文件*/
    #include "Board.h"
    
    /*变量、GUI Composer 可读取*/
    int count = 0;
    
    /*
    === gpioButtonFxn0 ===
    * Board_BUTTON0上 GPIO 中断的回调函数。
    //
    void gpioButtonFxn0 (unsigned int index)
    {
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_LED0);
    
    如果(count++=100){
    计数= 0;
    }
    }
    
    /*
    === gpioButtonFxn1 =========
    * Board_Button1上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    /void
    gpioButtonFxn1 (unsigned int index)
    {
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_LED1);
    
    如果(count++=100){
    计数= 0;
    }
    }
    
    /*
    === main ====
    */
    int main (void)
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initUART();
    
    /*打开用户 LED */
    GPIO_WRITE (Board_LED0、Board_LED_ON);
    
    System_printf ("启动 GPIO 中断示例\n 已设置系统提供程序"
    "添加到 SysMin。 停止目标以查看中的任何 SysMin 内容"
    " ROV.\n");
    /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
    system_flush();
    
    /*安装按钮回调*/
    GPIO_setCallback (INT_GPIOP3、gpioButtonFxn0);
    
    /*启用中断*/
    GPIO_enableInt (INT_GPIOP3);
    
    /*
    *如果您的器件有多个输入引脚可用、则会中断
    将在 Board_Button1上启用*。
    *
    if (Board_BUTTON0!= Board_Button1){
    /*安装按钮回调*/
    GPIO_setCallback (Board_Button1、gpioButtonFxn1);
    GPIO_enableInt (Board_Button1);
    }
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    } 

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

    你好 Jonas、

    谢谢、我还不是很熟悉 TI-RTOS、所以我不知道要对单个代码行做什么。

    好的、这里的问题是您尝试使用错误的 GPIO API 输入。 您需要修改 EK_TM4C1294XL.c 文件、即 GPIO_PinConfig、并在其中添加将为 GPIOTIVA_PP_3的 P3端口、而不是尝试强制 GPIO P3位于该位置:

    GPIO_PinConfig gpioPinConfigs[]={
    /*输入引脚*/
    /* EK_TM4C1294XL_USR_SW1 */
    GPIOTIVA_PJ_0 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    /* EK_TM4C1294XL_USR_SW2 */
    GPIOTIVA_PJ_1 | GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_RISING、
    
    /*输出引脚*/
    /* EK_TM4C1294XL_USR_D1 */
    GPIOTIVA_PN_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    /* EK_TM4C1294XL_USR_D2 */
    GPIOTIVA_PN_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW、
    }; 

    如果要使用 EK_TM4C1294XL_USR_SW1以外的新名称、则需要访问 EK_TM4C1294XL.h 并修改:

    /*!
    *@def EK_TM4C1294XL_GPIOName
    *@EK_TM4C1294XL 开发板上 LED 名称的简短枚举
    */
    typedef enum EK_TM4C1294XL_GPIOName{
    EK_TM4C1294XL_USR_SW1 = 0、
    EK_TM4C1294XL_USR_SW2、
    EK_TM4C1294XL_D1、
    EK_TM4C1294XL_D2、
    
    EK_TM4C1294XL_GPIOCOUNT
    }EK_TM4C1294XL_GPIOName; 

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

    您好、Ralph、

    非常感谢您的帮助! 在我调整了 EK_TM4C1294XL.h 和.c 文件中的代码后、我使中断正常工作。

    然后、我尝试在主管编写的现有项目中实现相同的代码、但很遗憾、它在该项目中不起作用。 代码背后的理念是 EK_TM4C1294XL 在中断时从加速计读取数据并将其置于队列中。 一旦中断完成、TCPworker 就会开始通过以太网连接将数据传输到 PC。 当我尝试连接到 launchpad 时、它会发送我通过以太网手动放入队列中的数据、但一旦我尝试生成中断、代码会跳转到"static void loader_exit (void)"处的"exit.c"文件。 我不知道为什么这么做、您能帮我吗?

    我将引脚 PP3配置为具有下拉电阻器的引脚、并在引脚变为高电平时生成中断。 代码如下。

    #include //int 类型
    #include //布尔类型
    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_ssi.h"
    #include "inc/hw_types.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    
    #include "driverlib/sctl.h"
    #include "driverlib/intranscts.h"#include "#包含"driverlib_inx.h
    
    
    
    tcpEcho.c ====
    *包含 BSD 套接字代码。
    */
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* NDK BSD 支持*//
    *********
    #include 
    
    /*示例/板头文件*//
    *********
    #include "Board.h"
    
    /*包含信标支持*//
    *********
    #include 
    #include 
    #include 
    
    //定义
    //*********
    #define TCPPACKETSIZE 256
    #define NUMTCPWORKERS 3
    #define NUMMSGS 8. /*消息数*/
    #define TIMEOUT 10. /*超时、以系统时钟周期为单位*//
    
    全局变量
    //Typedefs//
    *********
    /*由于第一个字段是 Queue_Elem,因此可以将此结构添加到队列中。 */
    typedef struct Rec{
    Queue_Elem;
    uint32_t data;
    }Rec;
    Queue_handle myQ;
    
    typedef struct MsgObj{
    int id;/* writer task id */
    int val;//消息值*/}
    MsgObj、*Msg;
    Mailbox_handle mbx0;
    
    
    //整数
    //
    uint32_t testVal = 0b001110000011100000111000001110000011100000111000;
    uint32_t* testVal2 =&testVal;
    uint32_t testVal3 = 0b1010101010101010101010101010101010;
    uint32_t* testVal4 = testVal3;
    uint32_t testVal3;uint32_t index
    ;uint32_t uint32_testert uint3;uint32_tas uint32
    
    uint32_t ui32SysClkFreq;
    uint32_t ui32Index;
    uint32_t loopindex;
    uint32_t pui32DataTx[4];
    uint32_t pui32DataRx[4];
    uint32_t pui32measData[12000];
    uint32_t serial_parallel;
    uint32_t DAC;
    uint32_t adc_config;
    uint32_t adc_meas;
    uint32_t meas 检测;
    uint32_t Test_Data;
    int Queue_empty;
    int i = 33;
    
    //其他内容
    //*********
    buffchar er2[100];
    
    //functions/*********
    
    void Meas Trig_IntHandler (void);
    void gpioButtonFxn0 (unsigned int index);
    
    /*=== tcpWorker ====
    *处理 TCP 连接的任务。 可以是多个正在运行的任务
    *此函数。
    //
    空 tcpWorker (UArg0、UArgarg1)
    {
    int clientfd =(int) arg0;
    int bytesRcvd;
    int bytesSent;
    char buffer[TCPPACKETSIZE];
    //char buffer3;
    
    System_printf ("tcpWorker:start clientfd = 0x%x\n"、clientfd);
    
    //定义响应
    buffer2[0]= 0x6A;
    buffer2[1]= 0x61;
    buffer2[2]= 0x6e;
    buffer2[3]= 0x00;
    
    字节接收= 4;
    /*
    *=========== 开始 IEPE 板
    *
    //初始化变量
    //
    uint32_t Queue_RETR_Ind;
    unsigned char bytes[4];
    无符号长整型 n = 175;
    REC R1、R2、R3、R4;
    RE* rp;
    
    //初始化频率为120 MHz 的时钟
    //
    ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
    
    //主例程
    //
    loopindex = 0;
    serial_parallel = 0;
    DAC = 0;
    ADC_CONFIG = 0;
    ADC_meas = 0;
    MEAS_INDEX = 0;
    
    while (1)
    {
    //
    //根据环路中的位置,解决了不同的组件
    //
    if (循环索引==1)
    {
    serial_parallel = 1;
    DAC = 0;
    ADC_CONFIG = 0;
    ADC_meas = 0;
    }
    if (循环索引== 2)
    {
    serial_parallel = 0;
    DAC = 1;
    ADC_CONFIG = 0;
    ADC_meas = 0;
    }
    if (循环索引== 3)
    {
    serial_parallel = 0;
    DAC = 0;
    ADC_CONFIG = 1;
    ADC_meas = 0;
    }
    if (循环索引== 4)
    {
    serial_parallel = 0;
    DAC = 0;
    ADC_CONFIG = 0;
    ADC_meas = 1;
    }
    if (循环索引> 4)
    {
    serial_parallel = 0;
    DAC = 0;
    ADC_CONFIG = 0;
    ADC_meas = 0;
    }
    
    //定义序列到并行零件
    //
    IF (serial_parallel = 1)// SRCS 中的引脚
    {
    //定义要发送的命令
    //
    pui32DataTx[0]= 250;//0b01111010;
    pui32DataTx[1]= 64;
    pui32DataTx[2]= 0;
    pui32DataTx[3]= 0;
    
    //定义 SSI 配置
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
    GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2);
    
    SSIConfigSetExpClk (SSI0_BASE、ui32SysClkFreq、SSI_FRF_MOTO_MODE_0、SSI_MODE_MASTER、2000000、 16);
    
    SSIEnable (SSI0_BASE);
    
    //手动触发 SRCS:将其置为高电平。 写入前将其置为低电平
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    GPIOPinTypeGPIOOutput (GPIO_PORTP_BASE、GPIO_PIN_0);
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_0、1);
    
    //将其放在 SPI 线上
    //
    
    //将 SRCS 置为低电平
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_0、0);
    
    //发送3个字节的数据。
    for (ui32Index = 0;ui32Index < 1;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    //
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    while (SSIBusy (SSI0_BASE))
    {
    }
    
    //将 SRCS 置为高电平
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_0、1);
    
    //将 R1添加到 myQ 的背面。
    R2.data = pui32DataTx[0];
    queue_put (myQ、&R2._elem);
    r1.data = pui32DataTx[1];
    queue_put (myQ、&r1._elem);
    }
    
    //定义 DAC 部分
    //
    如果(DAC = 1)// DAC 中的引脚
    {
    //定义要发送的命令
    //
    pui32DataTx[0]= 0|(65<6);//六表示您使用数据表中的6位 CFR 未使用的位进行移位// 0b0100000100000001;
    pui32DataTx[1]= 0;
    pui32DataTx[2]= 0;// 0b0010000100000001;
    pui32DataTx[3]= 0;
    
    //定义 SSI 配置
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
    GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2);
    
    SSIConfigSetExpClk (SSI0_BASE、ui32SysClkFreq、SSI_FRF_MOTO_MODE_3、SSI_MODE_MASTER、2000000、 16);
    
    SSIEnable (SSI0_BASE);
    
    //手动触发 DAC:将其置为高电平。 写入前将其置为低电平
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    GPIOPinTypeGPIOOutput (GPIO_PORTP_BASE、GPIO_PIN_1);
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_1、2);
    
    //
    //将其放在 SPI 线上
    //
    
    //将 DAC 置为低电平
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_1、0);
    
    //发送3个字节的数据。
    for (ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    while (SSIBusy (SSI0_BASE))
    {
    }
    
    //接收3个字节的数据。
    //SSIDataGet (SSI0_BASE、Test_Data);
    
    对于(ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    
    //SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    
    //由于我们使用的是8位数据,所以屏蔽 MSB。
    //pui32DataRx[ui32Index]&= 0x00FF;
    }
    
    while (SSIBusy (SSI0_BASE))
    {
    }
    
    //将 DAC 置为高电平
    GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_1、2);
    }
    //
    //定义 ADC 配置
    //
    IF (ADC_CONFIG = 1)// ADC 中的引脚
    {
    pui32DataTx[0]= 0b0100000100000001;//const uint16_t
    pui32DataTx[1]= 0b000000000010;
    pui32DataTx[2]= 0b0010000100000001;
    pui32DataTx[3]= 0;
    
    //发送3个字节的数据。
    for (ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    while (SSIBusy (SSI0_BASE))
    {
    }
    //接收3个字节的数据。
    //SSIDataGet (SSI0_BASE、Test_Data);
    对于(ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    //SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    
    //由于我们使用的是8位数据,所以屏蔽 MSB。
    //pui32DataRx[ui32Index]&= 0x00FF;
    }
    while (SSIBusy (SSI0_BASE))
    {
    }
    }
    
    //
    //开始 ADC 测量
    //
    IF (ADC_meas = 1)// ADC 中的引脚
    {
    pui32DataTx[0]= 0b00001000;//const uint16_t
    pui32DataTx[1]= 0;
    pui32DataTx[2]= 0;
    pui32DataTx[3]= 0;
    
    // //
    // // GPIO 激活
    // //
    GPIO_setCallback (EK_TM4C1294XL_PP3、gpioButtonFxn0);
    GPIO_enableInt (EK_TM4C1294XL_PP3);
    /*GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、GPIO_PIN_3); //将 PP3定义为输入
    GPIOIntClear (GPIO_PORTP_BASE、GPIO_PIN_3); PP 上的//清除中断
    GPIOIntRegister (GPIO_PORTP_BASE、Meas Trig_IntHandler); GPIO 端口的//寄存器中断处理程序
    GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_3、GPIO_RISING _EDGE);//设置耦合到引脚的中断类型
    //IntEnable (INT_GPIOP3); //启用中断
    GPIOIntEnable (GPIO_PORTP_BASE、GPIO_PIN_3); //启用中断
    IntPrioritySet (INT_GPIOP3、0); //设置中断的优先级*/
    //
    //
    // //发送 SSI 开始 ADC 测量
    // //
    // //发送3个字节的数据。
    //
    // for (ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    // {
    // //使用“阻塞”Put 函数发送数据。 此函数
    // //将等待发送 FIFO 中有空间后再返回。
    // //这使您可以确保发送的所有数据都将其输入
    // //发送 FIFO。
    // SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    //}
    // //等待 SSI0完成传输发送 FIFO 中的所有数据。
    // while (SSIBusy (SSI0_BASE)
    )// {
    //}
    }
    
    //
    //增加循环索引
    //
    loopindex = loopindex + 1;
    //SysCtlDelay (460000);
    /*
    *=========== 终端 IEPE 板
    *
    //查询记录并打印其数据
    Queue_empty = Queue_empty (myQ);
    queue_RETR_Indd = 0;
    
    while (!Queue_empty (myQ)&& i<40)
    {
    //隐式转换从(Queue_Elem *)到(建议*)
    RP = Queue_dequeue (myQ);
    buffer3 = rp->data;//get data out of rp
    
    //从32位 buffer3中提取4个字符
    字节[0]=(buffer3 & 0x000000UL)>> 24;
    字节[1]=(buffer3 & 0x00ff0000UL)>> 16;
    字节[2]=(buffer3 & 0x0000ff00UL)>> 8;
    字节[3]=(buffer3 & 0x000000ffUL) ;
    字节 Sent = SEND (clientfd、bytes、4、0);
    memset (buffer、0、sizeof buffer);
    //free(rp);
    REC Jonas;
    Jonas.data = I;
    queue_put (myQ、&Jonas._elem);
    i++;
    }
    system_printf ("tcpWorker stop clientfd = 0x%x\n"、clientfd);
    close (clientfd);
    }
    }
    
    /*
    === tcpHandler ====
    *创建新任务以处理新的 TCP 连接。
    */
    void MeasHandler (UArg0、UArg0 arg1)
    {
    INT 测试;
    整型迭代;
    
    迭代= 0;
    while (1)
    {
    如果(迭代= 1)
    {
    迭代= 0;
    }
    其他
    {
    迭代= 1;
    }
    }
    }/*
    
    === tcpHandler ====
    *创建新任务以处理新的 TCP 连接。
    //
    空 tcpHandler (UArg0、UArg0 arg1)
    {
    内部 状态;
    内部 客户;
    内部 服务器;
    struct sockaddr_in localAddr;
    struct sockaddr_in clientAddr;
    内部 光度;
    内部 optlen = sizeof (optval);
    socklen_t addrlen = sizeof (clientAddr);
    Task_handle 任务处理;
    Task_handle 任务处理2;
    Task_Params 任务参数;
    Task_Params 任务参数2;
    ERROR_Block EB;
    
    服务器=套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP);
    if (server ==1){
    System_printf ("错误:未创建套接字。\n");
    转到关断;
    }
    
    
    memset (localAddr、0、sizeof (localAddr));
    localAddr.Sin_Family = AF_iNet;
    localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
    localAddr.sin 端口= htons (arg0);
    
    status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
    如果(status =-1){
    System_printf ("错误:绑定失败。\n");
    转到关断;
    }
    
    状态=监听(服务器、NUMTCPWORKERS);
    如果(status =-1){
    System_printf ("错误:侦听失败。\n");
    转到关断;
    }
    
    optval = 1;
    if (setsockopt (server、SOL_socket、SO_keepalive、&optval、optlen)< 0){
    System_printf ("错误:setsockopt 失败\n");
    转到关断;
    }
    
    while ((clientfd =
    接受(server、(struct sockadr *)&clientAddr、&addrlen)!=-1){
    
    system_printf ("tcpHandler:创建线程 clientfd =%d\n"、clientfd);
    
    /* Init the Error_Block */
    ERROR_INIT (&EB);
    
    /*初始化默认值并设置参数。 *
    Task_Params_init (&taskParams);
    taskParams.arg0 =(UArg) clientfd;
    taskParams.STACKSIZE = 1280;
    //taskParams.priority = 15;
    taskHandle = Task_create ((Task_FuncPtr) tcpWorker、&taskParams、&EB);
    if (taskHandle == NULL){
    System_printf ("错误:创建新任务失败\n");
    close (clientfd);
    }
    /*
    *=========== 启动 IEPE
    */
    
    // /*初始化默认值并设置参数。 */
    // Task_Params_init (&taskParams2);
    // taskParams2.STACKSIZE = 1280;
    // taskParams2.priority = 15;
    // taskHandle2 = Task_create ((Task_FuncPtr) measWorker、&taskParams2、&EB);
    // if (taskHandle2 == NULL){
    // System_printf ("错误:创建新任务失败");
    //}
    /*
    *=========== 结束 IEPE
    *
    
    /* addrlen 是一个值结果参数,必须重置为下一个接受呼叫*/
    addrlen = sizeof (clientAddr);
    }
    System_printf ("错误:接受失败。\n");
    
    关机:
    如果(服务器> 0){
    关闭(服务器);
    }
    }
    /*
    === 读取器====
    //
    空读取器(UARg arg1、UARg arg2)
    {
    MsgObj msg;
    int i;
    对于(i=0;;i++){
    /*等待 writer()发布邮箱*/
    if (Mailbox_pend (mbx0、&msg、timeout)=0){
    System_printf ("读取器:Mailbox_pend 的超时()\n");
    中断;
    }
    asm (".global readerActive");
    asm ("readerActive:");
    /*打印值*/
    system_printf ("从(%d)读取'%d'。\n"、msg.val、msg.id);
    }
    System_printf ("读取器完成。\n"\});
    System_exit (0);
    }
    /*
    ==== Writer ====
    //
    void writer (UArg id、UArg arg2)
    {
    MsgObj msg;
    int i;
    对于(i=0;i < NUMMSGS;i++){
    /*填入值*/
    MSG.id = id;
    MSG.val = I;
    asm (".global writerActive");
    asm ("writerActive:");
    system_printf ("(%d)写入'%d'...\n"、id、msg.val);
    /*排队消息*/
    Mailbox_post (mbx0、&msg、超时);
    }
    system_printf ("写入器(%d)完成。\n"、id);
    }
    
    /*
    ============== 开始 IEPE
    */
    
    /*********
    // GPIO 输入中断
    //*********
    
    void Meas Trig_IntHandler (void)
    {
    ////*************
    ////定义发送命令
    ////*********
    // pui32DataTx[0]= 0b00010010;
    // pui32DataTx[1]= 0;
    // pui32DataTx[2]= 0;
    // pui32DataTx[3]= 0;
    
    //发送3个字节的数据。
    /* for (ui32Index = 0;ui32Index <4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    //
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    while (SSIBusy (SSI0_BASE)
    ){
    }
    
    //接收4个字节的数据。
    SSIDataGet (SSI0_BASE、Test_Data);
    
    for (ui32Index = 0;ui32Index < 4;ui32Index++)//NUM_SSI_DATA
    {
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    
    SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    SSIDataGet (SSI0_BASE、&pui32MeasData[meas_index]);
    
    //增加缓冲区索引
    MEAS_INDEX = MEAS_INDEX + 1;
    }
    
    while (SSIBusy (SSI0_BASE)
    {
    }
    如果(meas 索引> 12000)
    {
    MEAS_INDEX = 0;
    }*/
    }
    
    void gpioButtonFxn0 (unsigned int index)
    {
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_LED0);
    }
    /*
    ============ 结束 IEPE
    */
    
    /*
    === main ====
    //
    int main (int argc、char* argv[])
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initEMAC();
    
    myQ = Queue_create (NULL、NULL);
    
    system_printf ("启动 TCP 回显示例\n 系统提供程序设置为"
    "SysMin。 停止目标以查看中的任何 SysMin 内容"
    " ROV.\n");
    
    GPIO_WRITE (Board_LED0、Board_LED_OFF);
    
    /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
    system_flush();
    
    GPIO_setCallback (EK_TM4C1294XL_PP3、gpioButtonFxn0);
    GPIO_enableInt (EK_TM4C1294XL_PP3);
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    

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

    不能使用 GPIOIntRegister。 请参阅此主题上的最后一篇文章 :e2e.ti.com/.../635201

    不同的器件、但问题相同。

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

    您好 Todd、

    我猜您是指第382行的 GPIOIntRegister? 此行使用/*和*/进行注释,但在我之前的帖子中发布代码时没有出现。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否通过在映射文件中查找 IntRegister 来确认它未包含在内? 是否还可以检查 g_pfnRAMVectors?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我检查了工程调试文件夹中的.map 文件、但在文件中找不到 IntRegister 或 g_pfnRAMVectors。

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

    虽然不太可能成为"今天的扩展问题"的原因、但您之前的代码片段:

    如果(count++=100){
    计数= 0;


    可通过代入...来使其更加稳健。 if (count++>= 100){

    ("计数匹配"的准确性几乎不会让您受益、如果噪声、尖峰、ESD 达到、"扩展测试"提供的"安全"可能"挽救一天"。)

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

    不好。 好的、让我们更仔细地看看这个问题。 当你说"但一旦我尝试生成一个中断"时、哪个中断? 您是如何生成的?

    您是如何在 Tools->ROV->Hwi->Exception 中查看是否有异常的? 希望还会有一个调用堆栈(不保证)。

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

    我通过将引脚 PP3 (我将中断连接到该引脚)连接到电路板的+5V 来生成中断。 在 EK_TM4C1294XL.c 文件中、我将引脚设置为下拉模式、并在引脚变为高电平时触发。

    我找不到您谈到的"工具"目录、我应该在哪里查找?

    Jonas。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您使用 CCS、则在调试视图中会出现"Tools"菜单。 如果您使用的是 IAR、则需要将其插入 IAR。 有关详细信息、请参阅 TI-RTOS 入门指南。