您好:
我使用的是C6678的开发板,仿真器XDS100v,目前只在软件仿真。
任务是:想要完成多核图像处理,使用主核对图像进行分块,从核对每个数据块进行处理,再使用主核对各个处理结果进行整合。
问题是:使用notify()的例程,在从核程序中加入自己编写的子函数,在对数据块完成处理以后,程序卡停,不能激活主核进行结果整合。(尝试加入只有打印信息的子函数,可以完成主从核之间通信,没有问题。)
卡了很久很久了,找不到原因,希望能尽快解答,万分感谢!
DEBUG结果如图:(请问会停在这里的原因是什么?)
没有从核2的sent 打印信息,也没有主核0的最后接收打印信息
使用test子函数,可以看到完整的打印信息:
代码如下:
#include <xdc/std.h> /* -----------------------------------XDC.RUNTIME module Headers*/ #include <xdc/runtime/System.h> /* ----------------------------------- IPC module Headers*/ #include <ti/ipc/MultiProc.h> #include <ti/ipc/Notify.h> #include <ti/ipc/Ipc.h> /* ----------------------------------- BIOS6 module Headers*/ #include <ti/sysbios/knl/Semaphore.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/BIOS.h> /* ----------------------------------- To get globals from .cfg Header */ #include <xdc/cfg/global.h> /////// #include <stdio.h> //#include "ti/omp/omp.h" #include <c6x.h> #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ti/csl/csl_chip.h> #include <ti/csl/src/intc/csl_intc.h> #include <ti/csl/csl_cpintcAux.h> #include "ipc_interrupt.h" #include "math.h" #include "image.h" /////// #define INTERRUPT_LINE 0 /* Notify event number that the app uses */ #define EVENTID10 /* Number of times to run the loop */ #define NUMLOOPS1 UInt32 times = 0; UInt16 recvnumes = 0; #define masterProc 0 #define sloverProc1 1 #define sloverProc2 2 #define sloverNum 2 int readimagedata(const double *fp); void R1_inversion(double z[512][169]); void Rn_inversion(double z[512][169]); void R_RXD(double z[512][169],double z1[512]); void logo_matrix(); void logo_h(); void restore(); void test(double z[512][169]); static double h[4096][169]; static double g[4096][169]; double m=0.000000001; double rr=0; double f[4096],R1[169][169],R2[169],R22[169],Rm[169][169],r1_matrix[169][169],D1[169]; double z1[512][169],z2[512][169],z3[512][169],z4[512][169],z5[512][169],z6[512][169],z7[512][169],z8[512][169]; double z11[512],z22[512],z33[512],z44[512],z55[512],z66[512],z77[512],z88[512]; int m1[512],m2[512],m3[512],m4[512],m5[512],m6[512],m7[512],m8[512]; int k[64][64]; /* * ======== cbFxn ======== * This function was registered with Notify. It is called when any event is * sent to this processor. */ Void cbFxn(UInt16 procId, UInt16 lineId,UInt32 eventId, UArg arg, UInt32 payload) {/* The payload is a sequence number. */ if(procId!=masterProc) // 主核注册函数 { recvnumes++; // 接收从核的数目 if(recvnumes==sloverNum) // 当收到全部从核回复的信息 { recvnumes=0; Semaphore_post(semHandle); } } else{ times = payload; // 执行次数 Semaphore_post(semHandle); } } /* * ======== tsk0_func ======== * Sends an event to the next processor then pends on a semaphore. * The semaphore is posted by the callback function. */ Void tsk0_func(UArg arg0, UArg arg1) {Int i = 1;Int status;if (MultiProc_self() == masterProc) {while (i <= NUMLOOPS) { /* 这里可以添加主核需要执行的任务代码*/ readimagedata(image); logo_matrix(); logo_h(); //R1_inversion(z1); //Rn_inversion(z1); //R_RXD(z1,z11); printf("this is multicore,biubiubiu~~~");/* Send an event to the next processor */status = Notify_sendEvent(sloverProc1, INTERRUPT_LINE, EVENTID, i,TRUE);status = Notify_sendEvent(sloverProc2, INTERRUPT_LINE, EVENTID, i,TRUE);/* Continue until remote side is up */if (status < 0) {continue;}System_printf("MasterCore Sent Event to SloverCores in %d\n", i);/* Wait to be released by the cbFxn posting the semaphore */Semaphore_pend(semHandle, BIOS_WAIT_FOREVER); // 主核等待所有从核完成其工作返回System_printf("MasterCore Received Event from All SloverCores in %d\n",i);/* restore();FILE *fp1;int j=0;if((fp1=fopen("E:\\ccs_workspace\\RX_multicore\\RX_result.txt","w"))==NULL){ printf("cannot write file!\n");}printf("result ready!");for(i=0;i<64;i++){ for(j=0;j<64;j++) {fprintf(fp1,"%lf ",g[i][j]);if(j==63)fprintf(fp1,"\n"); }}fclose(fp1); */printf("result complete!");/* increment for next iteration */i++;}}else {while (times < NUMLOOPS) {/* wait forever on a semaphore, semaphore is posted in callback */Semaphore_pend(semHandle, BIOS_WAIT_FOREVER); // 等待主核通知开始执行任务System_printf("SloverCore%d Received Event from MasterCore in %d\n", MultiProc_self(),times);/* 这里可以添加从核执行的任务*///uint32_t coreID = CSL_chipReadReg (CSL_CHIP_DNUM);if (1==DNUM){ printf("this is core 1!"); //test(z2);R1_inversion(z2);//Rn_inversion(z2);//R_RXD(z2,z22);}else if (2==DNUM){printf("this is core 2!");// test(z3);R1_inversion(z3);//printf("core2 end!");// Rn_inversion(z3);//R_RXD(z3,z33);}/* Send an event to the next processor */status = Notify_sendEvent(masterProc, INTERRUPT_LINE, EVENTID, times,TRUE);if (status < 0) {System_abort("sendEvent to MasterCore failed\n");}System_printf("SloverCore%d sent Event from MasterCore in %d\n", MultiProc_self(),times);}}System_printf("Test completed\n");BIOS_exit(0); } /* * ======== main ======== * Synchronizes all processors (in Ipc_start), calls BIOS_start, and registers* for an incoming event */ Int main(Int argc, Char* argv[]) {Int status;status = Ipc_start();printf("Ipc_start ok!");if (status < 0) {System_abort("Ipc_start failed\n");}if(MultiProc_self()==masterProc){ while(Ipc_attach(sloverProc1)){ Task_sleep(1); }// 完成从核1的连接 while(Ipc_attach(sloverProc2)){Task_sleep(1); }// 完成从核2的连接status = Notify_registerEvent(sloverProc1, INTERRUPT_LINE, EVENTID,(Notify_FnNotifyCbck)cbFxn, NULL);if (status < 0) {System_abort("Notify_registerEvent for sloverCore1 failed\n");}// 完成从核1的事件注册status = Notify_registerEvent(sloverProc2, INTERRUPT_LINE, EVENTID,(Notify_FnNotifyCbck)cbFxn, NULL);if (status < 0) {System_abort("Notify_registerEvent for sloverCore2 failed \n");}// 完成从核2的事件注册}else{ while(Ipc_attach(masterProc)){Task_sleep(1); }// 完成主核0的连接status = Notify_registerEvent(masterProc, INTERRUPT_LINE, EVENTID,(Notify_FnNotifyCbck)cbFxn, NULL);if (status < 0) {System_abort("Notify_registerEvent for masterCore0 failed\n");}// 完成主核0的事件注册}BIOS_start();return (0); } /* */ /* * @(#) ti.sdo.ipc.examples.multicore.evm667x; 1, 0, 0, 0,1; 5-22-2012 16:36:06; /db/vtree/library/trees/ipc/ipc-h32/src/ xlibrary*/ int readimagedata(const double *fp) {int i,j;printf("readimagedata ok!\n");for (i=0; i<4096; i++){for (j=0; j<169; j++){ h[i][j]=*fp; fp+=1;//fscanf(fp, "%lf", &h[i][j]); //printf("%e\t",h[i][j]);}}printf("readimagedata complete!\n");return 0; } void logo_matrix() { printf("logo_matrix ok!"); int i=0,j=0; for(i=0;i<64;) { for(j=0;j<64;) { k[j][i]=1; j=j+2; } i=i+4; } for(i=1;i<64;) { for(j=0;j<64;) { k[j][i]=2; j=j+2; } i=i+4; } for(i=2;i<64;) { for(j=0;j<64;) { k[j][i]=3; j=j+2; } i=i+4; } for(i=3;i<64;) { for(j=0;j<64;) { k[j][i]=4; j=j+2; } i=i+4; } for(i=0;i<64;) { for(j=1;j<64;) { k[j][i]=5; j=j+2; } i=i+4; } for(i=1;i<64;) { for(j=1;j<64;) { k[j][i]=6; j=j+2; } i=i+4; } for(i=2;i<64;) { for(j=1;j<64;) { k[j][i]=7; j=j+2; } i=i+4; } for(i=3;i<64;) { for(j=1;j<64;) { k[j][i]=8; j=j+2; } i=i+4; } printf("logo_matrix complete!"); return; } void logo_h() { printf("logo_h ok!"); int i=0,j=0,count=0,a=0,b=0,c=0,d=0,e=0,f=0,g=0,x=0; for(i=0;i<512;i++){ m1[i]=0; m2[i]=0; m3[i]=0; m4[i]=0; m5[i]=0; m6[i]=0; m7[i]=0; m8[i]=0;} for(i=0;i<64;i++) { for(j=0;j<64;j++) { if(k[j][i]==1) { m1[a]=count; a++; } else if(k[j][i]==2) { m2[b]=count; b++; } else if(k[j][i]==3) { m3[c]=count; c++; } else if(k[j][i]==4) { m4[d]=count; d++; } else if(k[j][i]==5) { m5[e]=count; e++; } else if(k[j][i]==6) { m6[f]=count; f++; } else if(k[j][i]==7) { m7[g]=count; g++; } else if(k[j][i]==8) { m8[x]=count; x++; } count++; } //count++; }int n=0; for(n=0;n<169;n++) { for(i=0;i<512;i++) { z1[i][n]=h[m1[i]][n]; z2[i][n]=h[m2[i]][n]; z3[i][n]=h[m3[i]][n]; z4[i][n]=h[m4[i]][n]; z5[i][n]=h[m5[i]][n]; z6[i][n]=h[m6[i]][n]; z7[i][n]=h[m7[i]][n]; z8[i][n]=h[m8[i]][n]; } }printf("logo-h complete!");return; } void test(double z[512][169]) {printf("test ok!\n");printf("test complete!\n"); }
void R1_inversion(double z[512][169]) {printf("R1_inversion ok!\n"); int i=0,j=0; rr=0; //float r1_matrix[169][169]; for(i=0;i<169;i++) { for(j=0;j<169;j++) { R1[i][j]=0; r1_matrix[i][j]=0; } } for(i=0;i<169;i++){rr=z[0][i]*z[0][i]+rr;}rr=rr/m+1;printf("rr=%e\n",rr);for(i=0;i<169;i++){ for(j=0;j<169;j++) { r1_matrix[i][j]=z[0][i]*z[0][j]/m/m/rr; if(i==j) R1[i][j]=1/m-r1_matrix[i][j]; else R1[i][j]=-r1_matrix[i][j]; }}printf("R1_inversion complete!\n"); }
Shine:
请问在仿真模式下有这个问题吗?还是就软仿真有这个问题?
user5179571:
回复 Shine:
您好,我尝试了一下用板子仿真,结果还是传不过去,而且主核打印一堆信息。
我在想,是不是因为我的子函数里面设置的全局变量的问题,在并行计算的时候,会产生错误??
希望能尽快解答,万分感谢~~
Shine:
回复 user5179571:
子函数的全局变量放在哪里?如果放在DDR中,有没有做cache一致性维护?