DM6446开发板领航――loadmodules.sh文件详解

DM6446开发板领航――loadmodules.sh文件详解


针对ARM+DSP这种架构的CPUDM6446是很经典的一款。有些朋友觉得把DSPARM通信已经搞懂了,可是程序运行的时候,有时候能成功,有时候会死机。有的算法可以运行,有的算法却又不能运行。排除我们算法在语言及其逻辑的错误后,我们就应当仔细分析算法在内存方面的处理,系统内存的分配与使用情况。其中,在我们应用程序启动前,一般需要加载两个.ko文件,也就是dsplinkk.kocmemk.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指定了ARMDSP的共享内存的起始和终止位置,这点一定要与自己的系统一致。在DM6446中,内存分为三块,一块给ARM使用,也就是linux使用,第二块为共享内存,ARMDSP都可以访问,使用;第三块给DSP使用,DSP一般用来实现算法。DSPARM之间的通信通过共享内存来实现。

pools=1x3600000,5x829440,2x1244160,1x40960,2x8192

这个很多人不理解,往往自己的程序运行正确了,但是对这个并不理解。

共享内存被划分了多个内存池,你完全应该根据你算法的情况,来划分内存池。

1x3600000:代表划分了13600000字节大小的内存池

5x829440:代表划分了5829440字节大小内存池

……

说到这里,我们应该很容易就理解到,这个共享内存池的划分是:

13600000字节大小的buffer

5829440字节大小的buffer

21244160字节大小的buffer

140960字节大小的buffer

28192字节大小的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指令,我想大家都会很容易理解。如果大家有疑问或文章有不当之处,欢迎指定。谢谢。


你可能感兴趣的:(DM6446开发板,loadmodules.sh)