客流信息
DM6446开发板领航——loadmodules.sh文件详解
针对ARM+DSP这种架构的CPU,DM6446是很经典的一款。有些朋友觉得把DSP和ARM通信已经搞懂了,可是程序运行的时候,有时候能成功,有时候会死机。有的算法可以运行,有的算法却又不能运行。排除我们算法在语言及其逻辑的错误后,我们就应当仔细分析算法在内存方面的处理,系统内存的分配与使用情况。其中,在我们应用程序启动前,一般需要加载两个.ko文件,也就是dsplinkk.ko和cmemk.ko两个文件。这两个文件是由loadmodules.sh这个shell文件来加载的,这个文件一个作用是加载两个驱动文件,另一个重要的作用是对共享内存的分配,这点很多人没有理解或注意到。
 
下面是TI提供的一个loadmodules.sh文件,我来做详细的解说。
 
 
 
 
 
# insert cmemk, tell it to occupy physical118MB-128MB.
 
insmod cmemk.ko phys_start=0x87600000phys_end=0x88000000 pools=1x3600000,5x829440,2x1244160,1x40960,2x8192
 
 
 
# insert dsplinkk
 
insmod dsplinkk.ko
 
 
 
# make /dev/dsplink
 
rm -f /dev/dsplink
 
mknod /dev/dsplink c `awk"\$2=="dsplink" {print \$1}" /proc/devices` 0
 
 
 
loadmodules.sh文件的写法,根据DVSDK版本的不同,会不同。这个是DM6446使用的DVSDK2.0版本的。
 
# insert cmemk, tell it to occupy physical118MB-128MB.
 
insmod cmemk.ko phys_start=0x87600000phys_end=0x88000000
 
第一行是注释。start=0x87600000phys_end=0x88000000指定了ARM与DSP的共享内存的起始和终止位置,这点一定要与自己的系统一致。在DM6446中,内存分为三块,一块给ARM使用,也就是linux使用,第二块为共享内存,ARM和DSP都可以访问,使用;第三块给DSP使用,DSP一般用来实现算法。DSP和ARM之间的通信通过共享内存来实现。
 
pools=1x3600000,5x829440,2x1244160,1x40960,2x8192
 
这个很多人不理解,往往自己的程序运行正确了,但是对这个并不理解。
 
共享内存被划分了多个内存池,你完全应该根据你算法的情况,来划分内存池。
 
1x3600000:代表划分了1个3600000字节大小的内存池
 
5x829440:代表划分了5个829440字节大小内存池
 
……
 
说到这里,我们应该很容易就理解到,这个共享内存池的划分是:
 
1个3600000字节大小的buffer
 
5个829440字节大小的buffer
 
2个1244160字节大小的buffer
 
1个40960字节大小的buffer
 
2个8192字节大小的buffer
 
 
 
当你的算法使用共享内存时,系统会到你使用的内存放在大小最合适的内存池中。所谓最适合,就是能放下你的buffer,多余的空间又最小。
 
 
 
# insert dsplinkk
 
insmod dsplinkk.ko
 
这个是加载驱动
 
 
 
# make /dev/dsplink
 
rm -f /dev/dsplink
 
mknod /dev/dsplink c `awk"\$2=="dsplink" {print \$1}" /proc/devices` 0
 
 
 
删除节点和增加节点。
 
这些都是普通的linux指令,我想大家都会很容易理解。如果大家有疑问或文章有不当之处,欢迎指定。谢谢。