-
有这方面的专家请不吝指导下啊!!!
-
紧急求助啊!!!!
-
非常感谢你的资料!
按你说的,ARM端和DSP端的程序应该是分别独立的两个程序文件,也分别独立编译成各自的.out,分别各自烧到ARM端和DSP端, 是吧?!
-
真的非常感谢您的资料!
4. 你那边是否有关于DSPLINK完整的通信程序,如文档中的例程或其他的都可以,如果方便的话,可否发给我份,我的邮箱jinqing_wang@163.com
感谢!!!
-
非常感谢您的资料!看了资料,对于上面的问题,我是否可以这样理解:
1. DSP和ARM的程序是在同一个main函数里,程序结构采用多线程,采用DSPLINK 中的MSGQ等模块通信
2. 最程序是烧到ARM核,DSP端的程序是通过DSPLINK的PROG进行加载
3. 程序的编译环境不是在CCS上,是在Linux系统构建的专门DSPLINK编译平台(这里是命令行编译?)
以上请您再次帮忙指正,感谢!!!
-
谢谢!
因为这只是我的测试程序,我的正式程序比较长,所以写了个测试程序验证下这个结构是否能正常的执行。
-
不错,算了下,这个可以,虽然在这里程序执行会多几条指令,但在接下来的压缩步骤中会节省多时间!
-
1.量化的目的是把权值小的数组元素尽量的归0
2.
比如-3>>6 = -1用操作
i = 1
-
loop:
LDW *x1++, x0
LDW *y1++, y0
NOP 4
MPYSP x0, y0, prod0;
NOP 1
ADDSP sum1, prod0, sum1
SUB nx, 1, nx
[nx] B loop
.return sum1
你再试下
.endproc
-
您好!我按照您的指导修改了代码如下,但是运行还是不行,麻烦帮忙再看下我哪里出错了?非常感谢
* ===================== LOOP KERNEL ============================== *
MV .L1 A6, A_loopcount
loop:
LDB .D1T1 *A4++[1], A_x1
LDB .D2T2 *B4++[1], B_y1
SUB .L1 A_loopcount, 1, A_loopcount
CMPGT .L1 A_loopcount, 6, A_tmp
[A_tmp] B .S2 condition1
[A_tmp]ADDKPC loop, B3, 4
NOP 4
CMPGT .L1 A_loopcount, 3, A_tmp
[A_tmp] B .S2 condition2
[A_tmp]ADDKPC loop, B3, 4
NOP 4
CMPGT .L1 A_loopcount, 0, A_tmp
[A_tmp]B .S2 condition3
[A_tmp]ADDKPC loop, B3, 4
NOP 4
*===================== LOOP EPILOG ============================== *
[!A_loopcount]B .S2 B3 ;return
|| MVK .S1 1,A4 ;return 1
NOP 4
* ================= LOOP PROLOG ============================ *
condition1:
ADD .S1X A_x1, B_y1, A_sum
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
condition2:
SUB .S1X A_x1, B_y1, A_sum
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
condition3:
MPY .M1x A_x1, B_y1, A_sum
nop 1
STB .D2T1 A_sum, *B_s++[1]
[A_loopcount] B .S2 B3
nop 5
.end
-
原帖由 zw357234798 于 2012-6-13 12:29 发表 你可以用C编写,调试时查看他的反汇编代码。
从反汇编看不出什么,代码的风格不一样。。。
-
500*500= 250K, 你堆栈分配了5000=20K,不够
-
另外,程序编译会出现unresolved symbol condition1, first referenced in......
编译出错。。。这个该怎么解决呢
-
1.请帮看下下面这程序是否符合你上面所述的流程?
2. 另外,程序编译会出现unresolved symbol condition1, first referenced in......
请问要怎么修改呢?
.global function_1
.global function_2
.global function_3
......
[!value] B .S2 function_1
NOP 5
ADDKPC next_condition2, B3, 4
next_condition2:
CMPGT .L1 value, 1, A_tmp
[A_tmp] B .S2 function_2
NOP 5
ADDKPC next_condition3, B3, 4
next_condition3:
B .S2 function_3
NOP 5
ADDKPC next, B3, 4
*===================== LOOP EPILOG ============================== *
next:
[!A_loopcount]B .S2 B3 ;return
|| MVK .S1 1,A4 ;return 1
NOP 5
.end
function_1:
......
B .S2 B3
nop 5
function_2:
....
B .S2 B3
nop 5
function_3:
.....
B .S2 B3
nop 5
-
我也是今年刚学,没人教,唯一的心得就是多动手!
-
我的这部分源程序大多是小程序组成的,而且小程序里还有诸多分支,所以搞的程序性能很低,我才试着想用汇编手写看效率是否会高比如下面源程序if(! value){function_1;} else if(value >1){function_2;}function_3;用汇编我就得:[!value] B .S2 function_1|| CMPGT .L1 value, 1, A_tmp[A_tmp] B .S2 function_2NOP 5B .S2 function_3NOP 5function_1:...function_2:...function_3:...(1)其中有10个 NOP, 该怎么优化啊?
(2)这样的程序有错吧,因为跳转到function_1时,也会顺序执行下来把function_2和function_3也执行了吧,这样该怎么改呢?
怎么保证B跳转后,下面并行的语句不再执行呢?
[ 本帖最后由 breeze505 于 2012-5-24 11:34 编辑 ]
-
1. 双条件的我写了汇编如下,这样感觉NOP不是很多,你看是否正确:
[B_InputDatasize] LDH .D1T1 *A4++[1], A_input
[!B_InputDatasize] ZERO .L1 A_input
ZERO .D1 A_numZeros
NOP 2
[A_input] B .S2 RunLength
[B_InputDatasize]BDEC .S2 loop, B_InputDatasize
[!A_input]ADD .S1 A_numZeros, 1, A_numZeros
NOP 4
RunLength:
...
2.我的程序里分很多调用其他小程序,如计算一个bit位,写一个bit位等,循环下来会调用多次这样的小程序,请问这该怎么处理比较好呢?
能不能把这些小程序独立出来?那这样的话汇编里怎么调用这些小程序?
谢谢你指导下!
-
1. 嗯,我按你说的改写了代码,不传入结构体,如下:
tmp = encode(pSrc, datasize, stream->pBuffer,stream->size);
汇编如下,结果里还是没写stream->size成功,输出是0,哪里出错了?
* ================= LOOP PROLOG ============================ *
MV .S2 B4, B_loopcount
MV .S1 A6, A_pBuffer
ZERO .S2 B_size
* ===================== LOOP KERNEL ============================== *
loop:
LDB .D1T1 *A4++[1], A_tmp
SUB .S2 B_loopcount, 1,B_loopcount
NOP 3
STB .D1T1 A_tmp,*A_pBuffer++[1]
ADD .S2 B_size, 1, B_size
[B_loopcount] B .S2 loop
NOP 5
*===================== LOOP EPILOG ============================== *
STW .D2T2 B4, *+B6[0] ;store size
/*****若我在此行加上语句:NOP 1,则跑飞掉,这是为什么?******/
[!B_loopcount]B .S2 B3
|| MVK .S1 1,A4 ;return 1
.end
2. break;语句也是用B 指令吧(5个时钟跳转)?
-
1. 我编写了个直接赋值的测试程序,如下,运行结果buffer内容写进去了,但是size没写进去,请问我是哪里出错了?* ================= LOOP PROLOG ============================ *MV .S2 B4, B_loopcount LDW .D1T1 *+A6[0], A_pBufferLDW .D1T1 *+A6[1], A_buffersize ZERO .S1 A_size * ===================== LOOP KERNEL ============================== *loop:LDB .D1T1 *A4++[1], A_tmp SUB .S2 B_loopcount, 1,B_loopcount NOP 3 STB .D1T1 A_tmp,*A_pBuffer++[1] ADD .S1 A_size, 1, A_size [B_loopcount] B .S2 loop NOP 5 *===================== LOOP EPILOG ============================== *STW .D1T1 A_size,*A_buffersize++[1] NOP 1[!B_loopcount]B .S2 B3 || MVK .S1 1,A4 ;return 1.end2. CMP指令部门应该是:CMPEQ B16, 0, B0[!B0] B end_of_while //当input!=0的时候结束while,如inout=1,B0=0,!B0是为真,可跳出NOP 43. 是的,主要是我的算法这部分太耗时了,不得不对其进行优化。但我看算法流程里都是一个字节一个字节的判断,然后执行,判断就都涉及到跳转和NOP,很费效率,而且这个地方也不好用pipeline方式来优化。。。我真想不出怎么去优化,没思路,请指教啊。。
我的C程序里这些小函数都是用下面这种方式定义的:
#define GetNextInput(_n) \{ \if (data_size > 0) \{ \_n = *pSrc++; \data_size--; \} \else \{ \_n = 0; \} \}
[ 本帖最后由 breeze505 于 2012-5-10 13:58 编辑 ]
-
谢谢,问题都解决了,是因为LDB和跳转的时间没设计好!
现在开始另外一个函数的汇编程序,涉及到结构体,我另开了一个帖子