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.

[参考译文] LAUNCHXL-F28P65X:65x 中的 FreeRTOS 实现

Guru**** 2538950 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1421775/launchxl-f28p65x-freertos-implementation-in-65x

器件型号:LAUNCHXL-F28P65X
主题中讨论的其他器件:SysConfigC2000WARE

工具与软件:

大家好!

我正在尝试对我的裸机代码实施 FreeRTOS。 我使用了 针对 F28P65x 的 FreeRTOS 示例代码并针对我的应用程序进行了修改。 任务函数正在完美地执行 ,表明我的 FreeRTOS 实现是好的,但我的 ISR 不再执行. 在示例代码的主体, DINT 和 IER , IFR ,其中设置为0x0000 . 但我在初始化板和 REST 后重新启用全局和实时中断。 到底什么是停止我的 ISR 执行, FreeRTOS  有一个不同的方式来处理外设中断. 有人可以发送有关 FreeRTOS 的更详细的文档。 我浏览了大部分可用文档、但我不确定是什么原因导致了我的问题。

提前感谢您

Ashwin Bhaskar A.

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

    尊敬的 Ashwin:

    FreeRTOS 不处理硬件外设中断、这些中断应该正常发生。 您是否在 FreeRTOS 应用程序中的任何位置禁用中断/输入关键段? 此外、您正在使用哪些外设中断、并且为了阐明、这些中断在没有 FreeRTOS 的情况下可以按预期工作?

    如果您能够附加示例代码、这也有助于加快调试速度。

    谢谢!

    Arnav

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

    您好、Arnav、

    我尚未禁用中断或输入任何关键部分到目前为止。 我实现了 FreeRTOS、以查看它是否与 SCI 中断配合使用。  

    我正在附加代码  

    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "FreeRTOS.h"
    #include "board.h"
    #include "c2000_freertos.h"
    #include "stdio.h"
    //
    //User Defines
    //
    
    #define BUFFER_SIZE 10
    #define FIFO_LEVEL 1
    
    //
    //Function prototypes
    //
    void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName);
    void vApplicationMallocFailedHook(void);
    void error(void);
    //
    //Task functions
    //
    void gnss_task(void *);
    void gsm_task(void *);
    
    //
    //ISR functions
    //
    void INT_SCIX_RX_ISR(void);
    void INT_SCIY_RX_ISR(void);
    void INT_SCIX_TX_ISR(void);
    void INT_SCIY_TX_ISR(void);
    //
    //global variables
    //
    char NMEA_DATA[BUFFER_SIZE] = "XXXXXXXXX";
    char RTCM[BUFFER_SIZE] = "YYYYYYYYY";
    
    volatile uint16_t scitxBcount = 0;
    volatile uint16_t scirxBcount = 0;
    volatile uint16_t scitxAcount = 0;
    volatile uint16_t scirxAcount = 0;
    
    volatile uint16_t currNMEAptr = 0; //nmea buffer pointer
    volatile uint16_t currRTCMptr = 0; //rtcm buffer pointer
    volatile uint32_t intstat = 0;
    volatile uint16_t flag = 0;
    
    //
    //ISR
    //
    
    /***********************************************************************/
    __interrupt void INT_SCIX_RX_ISR(void){  //NMEA RECIEVE DATA ISR
        //RX ERROR HANDLING, NEED TO CHANGE ACCORDING TO APPLICATION REQUIREMENT
            uint32_t rxintstat = SCI_getInterruptStatus(SCIX_BASE);
            switch(rxintstat){
            case SCI_INT_PE:
            case SCI_INT_OE:
            case SCI_INT_FE:
            case SCI_INT_RXERR:
                error();
                break;
            default:
                break;
            }
            uint16_t bytestoread = FIFO_LEVEL;
            if(currNMEAptr+bytestoread > BUFFER_SIZE){
                bytestoread = BUFFER_SIZE - currNMEAptr;
            }
            NMEA_DATA[currNMEAptr++] = SCI_readCharBlockingNonFIFO(SCIX_BASE);
            if(currNMEAptr >= BUFFER_SIZE){
                currNMEAptr = 0; //reset NMEA pointer level
            }
        scirxAcount++;
        SCI_clearOverflowStatus(SCIX_BASE);
        SCI_clearInterruptStatus(SCIX_BASE, SCI_INT_RXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    __interrupt void INT_SCIY_RX_ISR(void){  //RTCM RECIEVE DATA ISR
        //RX ERROR HANDLING, NEED TO CHANGE ACCORDING TO APPLICATION REQUIREMENT
            uint32_t rxintstat = SCI_getInterruptStatus(SCIY_BASE);
            switch(rxintstat){
            case SCI_INT_PE:
            case SCI_INT_OE:
            case SCI_INT_FE:
            case SCI_INT_RXERR:
                error();
                break;
            default:
                break;
            }
            uint16_t bytestoread = FIFO_LEVEL;
            if(currRTCMptr+bytestoread > BUFFER_SIZE){
                bytestoread = BUFFER_SIZE - currRTCMptr;
            }
            RTCM[currRTCMptr++] = SCI_readCharBlockingNonFIFO(SCIY_BASE);
            if(currRTCMptr >= BUFFER_SIZE){
                currRTCMptr = 0; //reset NMEA pointer level
            }
        flag = 1;
        scirxBcount++;
        SCI_clearOverflowStatus(SCIY_BASE);
        SCI_clearInterruptStatus(SCIY_BASE, SCI_INT_RXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    
    /***********************************************************************/
    __interrupt void INT_SCIX_TX_ISR(void){
        BaseType_t xHighPriorityTaskWoken = pdFALSE;
        GPIO_togglePin(LED0_GPIO);
        scitxAcount++;
        SCI_clearInterruptStatus(SCIX_BASE, SCI_INT_TXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
        portYIELD_FROM_ISR(xHighPriorityTaskWoken);
    }
    __interrupt void INT_SCIY_TX_ISR(void){
        GPIO_togglePin(LED1_GPIO);
        scitxBcount++;
        SCI_clearInterruptStatus(SCIY_BASE, SCI_INT_TXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    
    //
    //Task Functions
    //
    
    void gnss_task(void * data){
        for(;;){
            intstat = SCI_getInterruptStatus(SCIX_BASE);
            SCI_writeCharArray(SCIX_BASE,(uint16_t*)RTCM,sizeof(RTCM)); //TRANSMIT THE RTCM DATA
            vTaskDelay(pdMS_TO_TICKS(500));
      }
    }
    
    void gsm_task(void * data){
        for(;;){
            SCI_writeCharArray(SCIY_BASE, (uint16_t*)NMEA_DATA,sizeof(NMEA_DATA)); //TRANSMIT NMEA DATA FOR RTCM CORRECTION
            vTaskDelay(pdMS_TO_TICKS(500));
        }
    }
    
    
    //
    // Main
    //
    void main(void)
    {
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
        Interrupt_initModule();
        //
        // Disable pin locks and enable internal pull-ups.
        //
        Device_initGPIO();
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // PinMux and Peripheral Initialization
        //
        EINT;
        ERTM;
    
        Board_init();
    
        FreeRTOS_init();
        //
        // C2000Ware Library initialization
        //
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
    
    
        while(1)
        {
    
           // SCI_writeCharArray(SCIY_BASE, (uint16_t*)NMEA_DATA,sizeof(NMEA_DATA));
        }
    }
    
    void error(void)
    {
        asm("     ESTOP0"); // Test failed
        for (;;);
    }
    
    void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
    {
        ( void ) pcTaskName;
        ( void ) pxTask;
    
        /* Run time stack overflow checking is performed if
        configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook
        function is called if a stack overflow is detected. */
        taskDISABLE_INTERRUPTS();
        for( ;; );
    }
    
    void vApplicationMallocFailedHook( void )
    {
        taskDISABLE_INTERRUPTS();
        for( ;; );
    }
    
    
    
    
    //
    // End of File
    //
    

    裸机代码运行正常、但当我启用 FreeRTOS 时、不再处理中断。 这到底是什么原因?

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

    您好、Arnav、

    [报价 userid="524707" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1421775/launchxl-f28p65x-freertos-implementation-in-65x/5450172 #5450172"]此外、您正在使用哪些外设中断、为了阐明这些中断在没有 FreeRTOS 的情况下能按预期工作?

    SCI 中断在没有 FreeRTOS 实现的情况下可以正常工作。

    CPU 计时器中断也适用于 FreeRTOS。 只有通过 PIE 配置的中断似乎才有问题。

    所附的代码只是一个示例代码,我是为了看看 FreeRTOS 是否与外设中断一起工作,这是我遇到这个问题的时候

    #include "driverlib.h"
    #include "device.h"
    #include "FreeRTOS.h"
    #include "board.h"
    #include "c2000_freertos.h"
    #include "stdio.h"
    //
    //User Defines
    //
    
    #define BUFFER_SIZE 10
    #define FIFO_LEVEL 1
    
    //
    //Function prototypes
    //
    void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName);
    void vApplicationMallocFailedHook(void);
    void error(void);
    //
    //Task functions
    //
    void gnss_task(void *);
    void gsm_task(void *);
    
    //
    //ISR functions
    //
    void INT_SCIX_RX_ISR(void);
    void INT_SCIY_RX_ISR(void);
    void INT_SCIX_TX_ISR(void);
    void INT_SCIY_TX_ISR(void);
    void INT_MYCPUTIMER0_ISR(void);
    //
    //global variables
    //
    char NMEA_DATA[BUFFER_SIZE] = "XXXXXXXXX";
    char RTCM[BUFFER_SIZE] = "YYYYYYYYY";
    
    volatile uint16_t scitxBcount = 0;
    volatile uint16_t scirxBcount = 0;
    volatile uint16_t scitxAcount = 0;
    volatile uint16_t scirxAcount = 0;
    
    volatile uint16_t currNMEAptr = 0; //nmea buffer pointer
    volatile uint16_t currRTCMptr = 0; //rtcm buffer pointer
    volatile uint32_t intstat = 0;
    volatile uint16_t flag = 0;
    volatile uint16_t overflowhook = 0;
    volatile uint16_t mallochook = 0;
    
    //
    //ISR
    //
    
    /***********************************************************************/
    __interrupt void INT_SCIX_RX_ISR(void){  //NMEA RECIEVE DATA ISR
        //RX ERROR HANDLING, NEED TO CHANGE ACCORDING TO APPLICATION REQUIREMENT
            uint32_t rxintstat = SCI_getInterruptStatus(SCIX_BASE);
            switch(rxintstat){
            case SCI_INT_PE:
            case SCI_INT_OE:
            case SCI_INT_FE:
            case SCI_INT_RXERR:
                error();
                break;
            default:
                break;
            }
            uint16_t bytestoread = FIFO_LEVEL;
            if(currNMEAptr+bytestoread > BUFFER_SIZE){
                bytestoread = BUFFER_SIZE - currNMEAptr;
            }
            NMEA_DATA[currNMEAptr++] = SCI_readCharBlockingNonFIFO(SCIX_BASE);
            if(currNMEAptr >= BUFFER_SIZE){
                currNMEAptr = 0; //reset NMEA pointer level
            }
        scirxAcount++;
        SCI_clearOverflowStatus(SCIX_BASE);
        SCI_clearInterruptStatus(SCIX_BASE, SCI_INT_RXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    __interrupt void INT_SCIY_RX_ISR(void){  //RTCM RECIEVE DATA ISR
        //RX ERROR HANDLING, NEED TO CHANGE ACCORDING TO APPLICATION REQUIREMENT
            uint32_t rxintstat = SCI_getInterruptStatus(SCIY_BASE);
            switch(rxintstat){
            case SCI_INT_PE:
            case SCI_INT_OE:
            case SCI_INT_FE:
            case SCI_INT_RXERR:
                error();
                break;
            default:
                break;
            }
            uint16_t bytestoread = FIFO_LEVEL;
            if(currRTCMptr+bytestoread > BUFFER_SIZE){
                bytestoread = BUFFER_SIZE - currRTCMptr;
            }
            RTCM[currRTCMptr++] = SCI_readCharBlockingNonFIFO(SCIY_BASE);
            if(currRTCMptr >= BUFFER_SIZE){
                currRTCMptr = 0; //reset NMEA pointer level
            }
        flag = 1;
        scirxBcount++;
        SCI_clearOverflowStatus(SCIY_BASE);
        SCI_clearInterruptStatus(SCIY_BASE, SCI_INT_RXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    
    /***********************************************************************/
    __interrupt void INT_SCIX_TX_ISR(void){
        BaseType_t xHighPriorityTaskWoken = pdFALSE;
        GPIO_togglePin(LED0_GPIO);
        scitxAcount++;
        SCI_clearInterruptStatus(SCIX_BASE, SCI_INT_TXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
        portYIELD_FROM_ISR(xHighPriorityTaskWoken);
    }
    __interrupt void INT_SCIY_TX_ISR(void){
        GPIO_togglePin(LED1_GPIO);
        scitxBcount++;
        SCI_clearInterruptStatus(SCIY_BASE, SCI_INT_TXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    
    //
    //Task Functions
    //
    __interrupt void INT_MYCPUTIMER0_ISR(void){
        GPIO_togglePin(LED0_GPIO);
        Interrupt_clearACKGroup(INT_MYCPUTIMER0_INTERRUPT_ACK_GROUP);
    }
    void gnss_task(void * data){
        for(;;){
            intstat = SCI_getInterruptStatus(SCIX_BASE);
            SCI_writeCharArray(SCIX_BASE,(uint16_t*)RTCM,sizeof(RTCM)); //TRANSMIT THE RTCM DATA
            vTaskDelay(pdMS_TO_TICKS(500));
      }
    }
    
    void gsm_task(void * data){
        for(;;){
            SCI_writeCharArray(SCIY_BASE, (uint16_t*)NMEA_DATA,sizeof(NMEA_DATA)); //TRANSMIT NMEA DATA FOR RTCM CORRECTION
            vTaskDelay(pdMS_TO_TICKS(500));
        }
    }
    
    
    //
    // Main
    //
    void main(void)
    {
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
        Interrupt_initModule();
        //
        // Disable pin locks and enable internal pull-ups.
        //
        Device_initGPIO();
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // PinMux and Peripheral Initialization
        //
        EINT;
        ERTM;
    
        Board_init();
    
        FreeRTOS_init();
        //
        // C2000Ware Library initialization
        //
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
    
    
        while(1)
        {
    
           // SCI_writeCharArray(SCIY_BASE, (uint16_t*)NMEA_DATA,sizeof(NMEA_DATA));
        }
    }
    

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

    尊敬的 Ashwin:  

    在 SysConfig 中、能否确保所有中断的"Enable interrupt in PIE (在 SysConfig 中启用中断)"选项已打开。 默认情况下、此设置为关闭。  

    谢谢!

    Arnav

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

    您好、Arnav

    它已启用、我使用 SysConfig 检查了所有可能的情况。 我已经实现了所需的一切。

    这不是问题解决方法。 此外、TI 的免费 RTOS 文档也非常有限。 特别是外设中断,还有什么我在代码中遗漏应该做的? .

    您能否与外设中断共享自由 RTOS 实现的工作代码? 此任务应该被中断抢占并执行 ISR。  

    谢谢!

    Ashwin Bhaskar A.

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

    尊敬的 Ashwin:

    我能够按原样运行您的代码、并且 ISR 按预期执行。

    以下是使用的 SysConfig 设置。 请注意、我在回送模式下使用 SCI 模块。

    /**
     * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
     * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
     * @cliArgs --device "F28P65x" --part "F28P65x_256ZEJ" --package "256ZEJ" --context "CPU1" --product "C2000WARE@5.03.00.00"
     * @v2CliArgs --device "TMS320F28P659DK-Q1" --package "256ZEJ" --variant "TMS320F28P659DK8-Q1" --context "CPU1" --product "C2000WARE@5.03.00.00"
     * @versions {"tool":"1.21.0+3717"}
     */
    
    /**
     * Import the modules used in this configuration.
     */
    const sci       = scripting.addModule("/driverlib/sci.js", {}, false);
    const sci1      = sci.addInstance();
    const sci2      = sci.addInstance();
    const FREERTOS  = scripting.addModule("/kernel/freertos_tool/FREERTOS", {}, false);
    const FREERTOS1 = FREERTOS.addInstance();
    
    /**
     * Write custom configuration values to the imported modules.
     */
    sci1.$name                      = "SCIX";
    sci1.selectRegisteredInterrupts = ["registerRxInt","registerTxInt"];
    sci1.useFifo                    = false;
    sci1.enabledInterrupts          = ["SCI_INT_RXRDY_BRKDT","SCI_INT_TXRDY"];
    sci1.enabledErrorInterrupts     = ["SCI_INT_FE","SCI_INT_OE","SCI_INT_PE","SCI_INT_RXERR"];
    sci1.loopback                   = true;
    sci1.rxQual.$name               = "myGPIOQUAL0";
    sci1.txQual.$name               = "myGPIOQUAL1";
    sci1.sciRXInt.enableInterrupt   = true;
    sci1.sciTXInt.enableInterrupt   = true;
    
    sci2.selectRegisteredInterrupts = ["registerRxInt","registerTxInt"];
    sci2.useFifo                    = false;
    sci2.enabledInterrupts          = ["SCI_INT_RXRDY_BRKDT","SCI_INT_TXRDY"];
    sci2.enabledErrorInterrupts     = ["SCI_INT_FE","SCI_INT_OE","SCI_INT_PE","SCI_INT_RXERR"];
    sci2.$name                      = "SCIY";
    sci2.loopback                   = true;
    sci2.rxQual.$name               = "myGPIOQUAL0_COPY";
    sci2.txQual.$name               = "myGPIOQUAL1_COPY";
    sci2.sciRXInt.enableInterrupt   = true;
    sci2.sciTXInt.enableInterrupt   = true;
    
    FREERTOS1.$name                   = "myFREERTOS0";
    FREERTOS1.CPU_CLOCK_HZ            = 200000000;
    FREERTOS1.MINIMAL_STACK_SIZE      = 256;
    FREERTOS1.USE_MUTEXES             = true;
    FREERTOS1.USE_RECURSIVE_MUTEXES   = true;
    FREERTOS1.USE_COUNTING_SEMAPHORES = true;
    FREERTOS1.vTaskSuspend            = false;
    FREERTOS1.tasks.create(2);
    FREERTOS1.tasks[0].taskStackSize  = 256;
    FREERTOS1.tasks[0].taskPriority   = 2;
    FREERTOS1.tasks[0].taskParams     = "0xDEADBEAF";
    FREERTOS1.tasks[0].taskPointer    = "gnss_task";
    FREERTOS1.tasks[0].$name          = "gnssTask";
    FREERTOS1.tasks[1].taskStackSize  = 256;
    FREERTOS1.tasks[1].taskPriority   = 1;
    FREERTOS1.tasks[1].taskParams     = "0xBAADF00D";
    FREERTOS1.tasks[1].taskPointer    = "gsm_task";
    FREERTOS1.tasks[1].$name          = "gsmTask";
    FREERTOS1.semaphores.create(1);
    FREERTOS1.semaphores[0].$name     = "binarySem1";

    请告诉我同样的方法是否适合您。 此外、您使用的是哪个版本的 C2000Ware?

    谢谢!

    Arnav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    告诉我同样的做法是否适合您。 此外、您使用的是哪个版本的 C2000Ware?[/QUOT]

    您好、Arnav、

    我将再次使用 sys config 重新检查它并返回给您。

    我认为 C2000Ware 版本是5.03