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.

C6678 task任务优先抢断



ti专家你好:

     我建立了两个task,一个task优先级为5他是处理函数 里面主要是在处理数据,另外一个task优先级为7他是接收函数,他主要接收fpga发送的数据,fpga发数是不定时的,主要是通过门铃来告诉我,数据已经到了。我在main函数中建立这两个task,因为接收数据优先级高,处理函数优先级低,但是我发现,处理函数中无法响应接收函数,我让fpga这边修改成5ms发送一次固定的数据,我处理函数起码要40ms,所以按理说最少我要最少进8次接收函数,但是我发现他没有进一次,我是两边加打印看的,麻烦ti专家指导一下,如果解决这个问题!按理说高优先级的任务会抢占低优先级的任务,但是我发现并没有发现,是否需要task嵌套才能实现?

  • 请问现在是无法进入接受函数的task吗?如果在高优先级任务中打断点可以进入吗?

    附件有个简单的task切换的例程,参考看一下。

    1373.task_TMS320C6678.zip

  • 我这边现在主要问题是在 我进入到处理函数中(低优先级) 处理数据的时候,高优先级的接收函数无法抢占处理数据的函数,fpga或者dsp发送门铃中断后,我还是在处理函数中,只能等到处理函数处理完,我才能被抢占!!!我目前不清楚问题出在哪里,不知道是我的.cfg少加东西了还是我的程序本事就有问题。。。。。

  • 相关代码贴出来看一下。

  • 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(&params);
    params.mode = Semaphore_Mode_BINARY;

    if(srioCBKInitFlag == 0)
    {
    DoorBellCbKSem = Semaphore_create(0, &params, 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();//保存数据到ddr
    Task_sleep(1);

    }
    }
  • 按理说 我在处理函数中的两个printf中间会夹杂着接收函数里面的打印,但是从打印出来的结果来看,他们中间是无任何打印加载其中