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.

问一个关于SYSbios的问题,我创建了一个优先级为1 的任务,任务中有pcie与上位的中断操作,现在如果我写一个srio的hwi,程序会先执行hwi吗?程序是通过pcie的bootloader加载进去的,如果想要在任务中执行完之后,再执行srio的hwi,这个要怎么实现?

Other Parts Discussed in Thread: SYSBIOS

task

//clear PCIE interrupt MSI0 and INTA, because boot loader need interrupt to weak up DSP to run.
//Boot loader step :
//1. load section to memory
//2. write MAGIC_ADDR with boot entry address
//3. send interrupt to DSP(MSI0 or INTA etc)
DEVICE_REG32_W(MSI0_IRQ_STATUS, 0x1);
DEVICE_REG32_W(PCIE_LEGACY_A_IRQ_STATUS, 0x1);
DEVICE_REG32_W(PCIE_IRQ_EOI, 0x0);

//时钟初始化
TSC_init();

//unused
DEVICE_REG32_W(0x1087fffc, (uint32_t)&_c_int00);
write_boot_magic_number();
//安装主机中断...........
InitHostInt();

//Srio模块初始化(包括pll,qmss、pktdma、DDR3, TSC,Gpio)
EDMA_init();
//DSP core speed: 100*10/1=1000MHz,仅需主核初始化
//KeyStone_main_PLL_init(100, 10, 1);
KeyStone_main_PLL_init(312.5, 32, 10);
//该函数配置参数需要修改
KeyStone_DDR_init (1000,2, 2, NULL);
//KeyStone_DDR_init (66.66667, 16, 1, NULL);

if(SrioInit() < 0)
{
return -1;
}

/* Initialize the SRIO Driver */
if (Srio_init () < 0)
{
System_printf ("Error: SRIO Driver Initialization Failed\n");
return -1;
}

//maokai:动态加载GPIO初始化
GPIO_init_mk();

//初始化SRIO Socket驱动
InitSrioDriver();

//maokai:translate the BARs to local RAM
ConfigPcieInBound_mk();

//创建任务前必须先进行SRIO\PCIE\EDMA\DDR3等外围接口及设备初始化
CreateTask();

//通知主机DSP初始化完成
DEVICE_REG32_W(0x10800000, 0x0C11FC00);
BIOS_start();
return (0);

task

Void TaskMain(UArg arg0, UArg arg1)
{
Int32 i=0,j=0xABAB4145,k=0,h=0,q=0;
while (1)
{
//SendInterruptToHost();
// Get access to resource
Semaphore_pend(semHostInt, BIOS_WAIT_FOREVER);
Semaphore_reset(semHostInt,0);

//UInt32 Pcie_Mode = DEVICE_REG32_R(0x10800000);
UInt32 Pcie_Mode = DEVICE_REG32_R(0x10800008);//;
UInt32 Cpu_data_length = DEVICE_REG32_R(0x1080000C);//DEVICE_REG32_R(0x8200000C);
UInt32 Cpu_data_srcaddr = 0x82000100;
UInt32 Cpu_data_dstaddr = 0x00000000;

UInt32 DspReadFPGA_srcaddr = DEVICE_REG32_R(0x10800018);
UInt32 DspReadFPGA_dstaddr = 0x10800010;

if(Pcie_Mode == 1)
{
i = 0xABAB4141;
DEVICE_REG32_W(0x10800040,i);
Pciedma_Srio_mk();
ClearInterruptToHost();
DEVICE_REG32_W(0x10800044,PCIE_EP_IRQ_CLR);
//SendInterruptToHost();

}
else if(Pcie_Mode == 2)
{

if(Cpu_data_length != 0)
{

DEVICE_REG32_W(0x10800044,j);
WriteFpgaByDioSockets_nwrite_mk (Cpu_data_dstaddr,(Uint8*) Cpu_data_srcaddr,8*Cpu_data_length);
SendInterruptToHost();
}
else
{
j++;
DEVICE_REG32_W(0x10800050,j);
SendInterruptToHost();
}

}
else if(Pcie_Mode == 3)
{
k++;
DEVICE_REG32_W(0x10800048,k);
Dsp_config_fpga_mk();
TSC_delay_ms(1000);
//SrioInit();
SendInterruptToHost();
}
else if(Pcie_Mode == 4)
{
h++;
DEVICE_REG32_W(0x1080004C,h);
ReadFpgaByDioSockets(DspReadFPGA_srcaddr,(UInt8 *) DspReadFPGA_dstaddr,8);
SendInterruptToHost();
}
}

}

Void CreateTask(Void)
{
Task_Params taskParams;

UInt32 uiCoreNum = 0;
// Create two tasks that share a resource
uiCoreNum = CSL_chipReadReg (CSL_CHIP_DNUM);

if (uiCoreNum == CORE_SYS_INIT)
{
Task_Params_init(&taskParams);
taskParams.priority = 1;
taskParams.stackSize = 8192;
Task_create (TaskMain, &taskParams, NULL);