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.
工具与软件:
大家好!
我正在尝试对我的裸机代码实施 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