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.

[参考译文] TMS320F28379D:IPC ISR 和队列读取不起作用

Guru**** 2482225 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1445052/tms320f28379d-ipc-isr-and-queue-reading-not-working

器件型号:TMS320F28379D
Thread 中讨论的其他器件: C2000WARE

工具与软件:

您好!  

 我目前使用的是 TMS320F28379D MCU 和 C2000Ware 库。

我正在尝试将一些数据发送到 CPU1到 CPU2、并且我遵循示例代码。

我修改了代码、像每一分钟队列都会更新数据一样、CPU2中的每一分钟 ISR 将触发一次、LED 将亮起。

但我遇到了一些问题。

可能是我出错了、或者缺少一些初始化。

1. ISR 仅先触发2-3次  

2.无法从 Queue( IPC_readMessageFromQueue()  该 API 返回 flase )中读取数据

下面给出了相关代码、请帮助我解决此问题。

_______________ CPU1 code*****

/**
* main.c
*/
#include "device/driverlib.h"
#include "device/device.h"
#include "inc/hw_ipc.h"

//------------------
//为处理器间通信定义 IPC
//------------------
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001

#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA

#pragma DATA_SECTION (ReadData、"MSGRAM_CPU1_TO_CPU2")
无符号 ReadData[10]={0};

//
// Main (主菜单)
//

void main (void)

INT I = 0;

IPC_MessageQueue_t MessageQueue;
IPC_Message_t TxMsg、RxMsg;
device_init();

#ifdef _standalone
#ifdef _flash
//
//发送引导命令以允许 CPU2应用程序开始执行
//
DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else
//
//发送引导命令以允许 CPU2应用程序开始执行
//
DEVICE_BOOTCPU2 (C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);

#endif //_flash
#endif //_standalone
device_initGPIO();
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED1、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED1、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED2、GPIO_PIN_TYPE_STD);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED2、GPIO_DIR_MODE_OUT);
GPIO_setMasterCore (DEVICE_GPIO_PIN_LED2、GPIO_CORE_CPU2);
Interrupt_initModule();
interrupt_initVectorTable();
//清除 IPC 中断
IPC_clearFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG_ALL);
//初始化消息队列
IPC_initMessageQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_INT1、IPC_INT1);

IPC_SYNC (IPC_CPU1_L_CPU2_R、IPC_FLAG31);
EINT;
ERTM;
DEVICE_DELAY_US (1000000);
for (i=0;i<10;i++)

ReadData[i]= i;
}
TxMsg.command = IPC_CMD_READ_MEM;
TxMsg.address =(uint32_t) ReadData;
TxMsg.dataw1 = 10;
TxMsg.dataw2 = 1;
IPC_sendMessageToQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_ADDR_CORRECTION_ENABLE、&TxMsg、IPC_BLOCKING_CALL);
//
//永远循环
//
for (;;)

//
//打开 LED
//
GPIO_writePin (DEVICE_GPIO_PIN_LED1、0);
DEVICE_DELAY_US (1000000);
GPIO_writePin (DEVICE_GPIO_PIN_LED1、1);
for (i=0;i<10;i++)

ReadData[i]= i;
}
TxMsg.command = IPC_CMD_READ_MEM;
TxMsg.address =(uint32_t) ReadData;
TxMsg.dataw1 = 10;
TxMsg.dataw2 = 1;
IPC_sendMessageToQueue (IPC_CPU1_L_CPU2_R、&MessageQueue、IPC_ADDR_CORRECTION_ENABLE、&TxMsg、IPC_nonblocking_call);
DEVICE_DELAY_US (1000000);
}
}

*香港特别行政区政府在香港特别行政区政府的工作 第二阶段工作计划(续

//包含的文件
//
#include "driverlib.h"
#include "device.h"

#include "interrupt.h"
#include "inc/hw_ipc.h"

#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001

#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
#define IPC_1 INT_IPC_1

IPC_MessageQueue_t messageQueue;
_bool ipcISR =0;

void Board_init ();
//
// Main (主菜单)
//
void main (void)

device_init();


Interrupt_initModule();


interrupt_initVectorTable();


board_init();


IPC_clearFlagLtoR (IPC_CPU2_L_CPU1_R、IPC_FLAG_ALL);

IPC_initMessageQueue (IPC_CPU2_L_CPU1_R、&messageQueue、IPC_INT1、IPC_INT1);

EINT;


ERTM;


// Interrupt_enable (IPC_INT1);
IPC_SYNC (IPC_CPU2_L_CPU1_R、IPC_FLAG31);

GPIO_writePin (DEVICE_GPIO_PIN_LED2、1);// LED 熄灭
while (1)

   if (ipcISR == true)
   {
     ipcISR = false;
     GPIO_writePin (DEVICE_GPIO_PIN_LED2、0);// LED 亮起
   }
   设计
      GPIO_writePin (DEVICE_GPIO_PIN_LED2、1);// LED 熄灭
      //延迟一位。
      DEVICE_DELAY_US (250000);
}
}


/*
*简称 IPC 中断函数
*
*/
__interrupt void ipc_isr1()

       IPC_Message_t RxMsg;

       _Bool 状态= false;
       Char i =0;
       ipcISR = true;
       //从 IPC 队列中读取
       IPC_readMessageFromQueue (IPC_CPU2_L_CPU1_R、&messageQueue、IPC_ADDR_CORRECTION_ENABLE、
                                 &RxMsg、IPC_nonblocking_call);
       if (RxMsg.command == IPC_CMD_READ_MEM)
       {
          状态= true;
          for (i=0;i<RxMsg.dataw1;i++)
       {
           if (*((uint32_t *) RxMsg.address + i)!= i)
            状态= false;
       }
      }

//
//确认标志
//
      IPC_ackFlagRtoL (IPC_CPU2_L_CPU1_R、IPC_FLAG1);

//
//确认 PIE 中断。
//
      interrupt_clearACKGroup (INTERRUPT_ACK_GROUP1);
}

void IPC_SYSCFG_init ()

}

空 Board_init()

EALLOW;

IPC_SYSCFG_INIT ();
INTERRUPT_REGISTER (IPC_1、&IPC_ISR1);
INTERRUPT_ENABLE (IPC_1);
EDIS;
}


//
//结束文件
//

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

    您好!

    很抱歉延迟了响应。
    我尝试了此处随附的代码。 中断按预期触发、 IPC_readMessageFromQueue()返回 true。 我无法重现问题。
    您能从您这边重试吗?
    此外、您还可以在此处共享.out 文件、以便我了解所发生的情况。

    谢谢!
    Samritha