主题:C2000WARE 中讨论的其他器件
工具/软件:
大家好!
我尝试更改 从 CM 到 CPU1内核的通信的 C2000Ware 示例 ipc_ex2_msgqueue。 未添加其他功能。
问题是 CPU1上的中断仅触发一次。 为了进行验证、我从示例中发送了同一条消息
中间有短延迟的第二次。 CM 内核上的代码卡在第二个 IPC_readMessageFromQueue() IPC_ISR1上
未触发。 有人知道吗、如何 在 CPU1上重新启用 IPC_ISR1 ()中断?
从 CPU1到 CM 的类似双消息通信可以正常工作。
CPU1代码:
#include "driverlib.h"
#include "device.h"
//
//定义
//
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
IPC_MessageQueue_t 消息队列;
int cnt = 0;
//
//标志1的 IPC ISR
// C28x 内核使用标志0发送带有消息队列的数据
//
__interrupt void IPC_ISR1()
{
int i;
IPC_Message_t TxMsg、RxMsg;
bool 状态= false;
CNT++;
//
//从消息队列中读取消息
//
IPC_readMessageFromQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_ADDR_CORRECTION_ENABLE、
&RxMsg、ipc_nonblocation_call);
IF (RxMsg.command = IPC_CMD_READ_MEM)
{
status = true;
//
//读取和比较数据
//
for (I=0;i<RxMsg.dataw1;I++)
{
if (*((uint32_t *) RxMsg.address + i)!= i)
状态= false;
}
}
//
//发送响应消息
//
TxMsg.command = IPC_CMD_RESP;
TxMsg.address = 0;//未使用
TxMsg.dataw1 =状态? test_pass:test_fail;
TxMsg.dataw2 = RxMsg.dataw2;//使用接收消息中的消息标识符
IPC_sendMessageToQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_ADDR_CORRECTION_DISABLE、
&TxMsg、ipc_nonblocking_call);
//
//确认标志
//
IPC_ackFlagRtoL (IPC_CPU1_L_CM_R、IPC_Flag1);
//
//确认 PIE 中断。
//
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP1);
}
//
//主要
//
void main (void)
{
//
//初始化器件时钟和外设
//
设备初始化();
//
//引导 CM 内核
//
#ifdef _flash
DEVICE_BOOTCM (BOOT_BOOT_TO_FLASH_SECTOR0);
#else
DEVICE_BOOTCM (BOOT_BOOT_TO_S0RAM);
#endif
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();
//
//使用指向 shell 中断的指针初始化 PIE 向量表
//服务例程(ISR)。
//
Interrupt_initVectorTable();
//
//清除所有 IPC 标志(如果已设置)
//
IPC_clearFlagLtoR (IPC_CPU1_L_CM_R、IPC_FLAG_ALL);
//
//启用 IPC 中断
//
IPC_registerInterrupt (IPC_CPU1_L_CM_R、IPC_INT1、IPC_ISR1);
//
//初始化消息队列
//
IPC_initMessageQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_INT1、IPC_INT1);
//
//同步两个内核。
//
IPC_SYNC (IPC_CPU1_L_CM_R、IPC_FLAG31);
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
//
//永远循环。 等待 IPC 中断
//
while (1);
}
CM 代码:
#include "cm.h"
#include "ipc.h"
//
//定义
//
#define IPC_CMD_READ_MEM 0x1001
#define IPC_CMD_RESP 0x2001
#define TEST_PASS 0x5555
#define TEST_FAIL 0xAAAA
#pragma DATA_SECTION (ReadData、"MSGRAM_CM_TO_CPU1")
uint32_t ReadData[10];
uint32_t pass;
//
//主要
//
void main (void)
{
int i;
IPC_MessageQueue_t 消息队列;
IPC_Message_t TxMsg、RxMsg;
//
//初始化器件时钟和外设
//
cm_init();
//
//清除所有 IPC 标志(如果已设置)
//
IPC_clearFlagLtoR (IPC_CM_CPU1_R、IPC_FLAG_ALL);
//
//初始化消息队列
//
IPC_initMessageQueue (IPC_CM_CPU1_R、&messageQueue、IPC_INT1、IPC_INT1);
//
//同步两个内核
//
IPC_SYNC (IPC_CM_L_CPU1_R、IPC_FLAG31);
//启用全局中断
///__enable_irq();
//
//填写要发送的数据
//
对于(I=0;I<10;I++)
{
ReadData[i]= i;
}
//
//更新消息
//
TxMsg.command = IPC_CMD_READ_MEM;
TxMsg.address =(uint32_t) ReadData;
TxMsg.dataw1 = 10;//使用 dataw1作为数据长度
TxMsg.dataw2 = 1;//消息标识符
//
//将消息发送到队列
//由于 C28x 和 CM 不共享共享 RAM 的相同地址空间、
//已启用 address_correction
//
ipc_sendMessageToQueue (ipc_CM_L_CPU1_R、&messageQueue、ipc_ADDR_CORRECTION_ENABLE、
&TxMsg、ipc_blocking_call);
//
//从队列中读取消息
//从 CM 返回的消息不使用地址字段、因此
//不使用 address_COREECTION 功能
//
IPC_readMessageFromQueue (IPC_CM_L_Cpu1_R、&messageQueue、IPC_ADDR_CORRECTION_DISABLE、
&RxMsg、IPC_BLOCKING_CALL);
if ((RxMsg.command == IPC_CMD_RESP)&&(RxMsg.dataw1 == TEST_PASS)&&(RxMsg.dataw2 == 1))
PASS = 1;
暴露
PASS = 0;
DEVICE_DELAY_US (500000);
ipc_sendMessageToQueue (ipc_CM_L_CPU1_R、&messageQueue、ipc_ADDR_CORRECTION_ENABLE、
&TxMsg、ipc_blocking_call);
//
//从队列中读取消息
//从 CM 返回的消息不使用地址字段、因此
//不使用 address_COREECTION 功能
//
IPC_readMessageFromQueue (IPC_CM_L_Cpu1_R、&messageQueue、IPC_ADDR_CORRECTION_DISABLE、
&RxMsg、IPC_BLOCKING_CALL);
if ((RxMsg.command == IPC_CMD_RESP)&&(RxMsg.dataw1 == TEST_PASS)&&(RxMsg.dataw2 == 1))
PASS = 1;
暴露
PASS = 0;
//
//示例末尾。 一直循环
//
while (1);
}