ti专家你好:
我建立了两个task,一个task优先级为5他是处理函数 里面主要是在处理数据,另外一个task优先级为7他是接收函数,他主要接收fpga发送的数据,fpga发数是不定时的,主要是通过门铃来告诉我,数据已经到了。我在main函数中建立这两个task,因为接收数据优先级高,处理函数优先级低,但是我发现,处理函数中无法响应接收函数,我让fpga这边修改成5ms发送一次固定的数据,我处理函数起码要40ms,所以按理说最少我要最少进8次接收函数,但是我发现他没有进一次,我是两边加打印看的,麻烦ti专家指导一下,如果解决这个问题!按理说高优先级的任务会抢占低优先级的任务,但是我发现并没有发现,是否需要task嵌套才能实现?
Nancy Wang:
请问现在是无法进入接受函数的task吗?如果在高优先级任务中打断点可以进入吗?
附件有个简单的task切换的例程,参考看一下。
task_TMS320C6678.zip
JohnieSi1:
回复 Nancy Wang:
我这边现在主要问题是在 我进入到处理函数中(低优先级) 处理数据的时候,高优先级的接收函数无法抢占处理数据的函数,fpga或者dsp发送门铃中断后,我还是在处理函数中,只能等到处理函数处理完,我才能被抢占!!!我目前不清楚问题出在哪里,不知道是我的.cfg少加东西了还是我的程序本事就有问题。。。。。
Nancy Wang:
回复 JohnieSi1:
相关代码贴出来看一下。
JohnieSi1:
回复 Nancy Wang:
Int main()
{initEMIF();initSRIO();
setSrioDoorBellCallBack(); //回调函数
Task_Params tskParams;Task_Params_init(&tskParams);tskParams.affinity = Task_AFFINITY_NONE;tskParams.priority = 3;tskParams.stackSize = 0x8000;
Task_Handle task;Error_Block eb;Error_init(&eb);task = Task_create(CHULI_Task, &tskParams, &eb);if (task == NULL) {System_printf("Task_create() failed!\n");BIOS_exit(0);}BIOS_start();/* does not return */return(0);
}void CHULI_thr()
{int i= 0;
printf("chu li kai shi.\r\n");
init_data();//初始化数据 这三个函数没有任何 延迟之类的 只是简单的搬移数据到共享内存
memcpy_data();//memcpy
edma_tr();//edma搬移
printf("chu li wan bi.\r\n");}
void setSrioDoorBellCallBack(void)
{static int srioCBKInitFlag = 0;Semaphore_Params params;Semaphore_Params_init(¶ms);params.mode = Semaphore_Mode_BINARY;
if(srioCBKInitFlag == 0){DoorBellCbKSem = Semaphore_create(0, ¶ms, NULL);SRIO_DoorBellCallBackBind(SRIO_cbk_isr);srioCBKInitFlag = 1;}
}static void SRIO_cbk_isr(unsigned short sourceId,unsigned short dbData)//0–
{totalDBCnt++;doorBellInfo = dbData;Semaphore_post(DoorBellCbKSem);
}
Void CHULI_Task(UArg a0, UArg a1)
{initEMIF();initSRIO();
// 启动在线更新任务Error_Block eb;Error_init(&eb);Task_Params tskParams;
Error_init(&eb);Task_Params_init(&tskParams);tskParams.affinity = Task_AFFINITY_NONE;tskParams.priority = 7;tskParams.stackSize = 0x8000;Task_create((Task_FuncPtr)srioRcvTaskFxn, &tskParams, &eb);
doorbell_to_Fpga(1);//发送一个门铃 fpga间隔3ms发送一次数据
fdCloseSession((HANDLE)Task_self());fdOpenSession((HANDLE)Task_self());while(1){if(times_flag==1){times_chuli++;CHULI_thr();//处理函数times_flag = 0;}Task_sleep(1);}
}
void srioRcvTaskFxn(UArg a0, UArg a1)
{int j;
while(1){Semaphore_pend(doorBellSem, BIOS_WAIT_FOREVER);j++;if(j==4){j= 0;printf("jie shou kai shi.\r\n");//每4包数打印一次}save_data_to_ddr();//保存数据到ddrTask_sleep(1);
}
}
JohnieSi1:
回复 JohnieSi1:
按理说 我在处理函数中的两个printf中间会夹杂着接收函数里面的打印,但是从打印出来的结果来看,他们中间是无任何打印加载其中
TI中文支持网