DSP

建立syslink双核工程和make运行

2019-07-13 10:55发布

建立工程+ j! |; `9 ~8 l  d0 D
% I5 C1 A1 _: W) i
 这一节将涉及到 ex01_helloworld 这个例程和 GNU make 这个工具,但我们并不会进行源码的解释和对 make 工具的使用方法的说明。
 现在我们先查看 ex01_helloworld 的例程源码,然后使用 make 对其进行自动化构建。为了便于演示,我们尽可能去掉了那些“干扰”因子。. P) k; V7 T( N; X6 [  P: W
 “清理”过的例程的源码如下:
" U2 v- N" Q3 n  }
├── dsp  A; k2 c+ Z$ P9 j% n! f4 A( m
│   ├── Dsp.cfg
│   ├── main_dsp.c! @, Y+ ~$ J3 h& {
│   ├── Server.c2 ^# e6 a) a9 b# j9 |& M7 V; `
│   └── Server.h+ e+ t4 `9 q5 T
├── host
│   ├── App.c
│   ├── App.h
│   └── main_host.c
└── shared
   ├── config.bld* k$ f" B7 `/ G; X' ~; c( J, K. u
   └── SystemCfg.h
 现在,我们开始为其编写 makefile 文件。根据目录结构,编写 ./makefile、./dsp/makefile、./host/makefile 这三个文件。0 Z' X  Y  a' G0 k4 l& X
3 f6 Z5 B2 `" d- s
./makefile. p! R; q8 s: r4 T

1 SYSLINK_INSTALL_DIR      = your/mcsdk/path/syslink_2_21_01_05
2 IPC_INSTALL_DIR          = your/mcsdk/path/ipc_1_25_03_15
- L) c) a# h7 Z/ c
4 CGT_ARM_INSTALL_DIR      = your/toolchain/path/arm-none-linux-gnueabi
5 CGT_ARM_PREFIX           = $(CGT_ARM_INSTALL_DIR)/bin/arm-none-linux-gnueabi-
2 M5 c6 h( I/ y4 `( J% V: y
7 BIOS_INSTALL_DIR         = your/ccs/path/bios_6_35_04_50
8 XDC_INSTALL_DIR          = your/ccs/path/xdctools_3_25_03_72, m$ Y; I& I2 I1 M) h% a: c
9 CGT_C674_ELF_INSTALL_DIR = your/ccs/path/ccsv5/tools/compiler/c6000_7.4.4- [5 j0 W/ T* r: `* c% k6 i2 k
10 8 V/ K( U: Z% S- _* i8 ?8 T
11 export SYSLINK_INSTALL_DIR      
12        IPC_INSTALL_DIR          7 Z+ e% i0 B* s+ ~3 ^( n
13        BIOS_INSTALL_DIR         
14        XDC_INSTALL_DIR          ( s% V" m( b/ W- W
15        CGT_C674_ELF_INSTALL_DIR / v& Y. v1 W2 K% E7 T! H- }+ P& Q
16        CGT_ARM_PREFIX- D! _+ Z* W$ S/ {4 Q
17 : D- R; Y! E% a5 b
18 all:
19     make -C host all
20     make -C dsp all
21 : n" o# o$ Z2 [) G3 V" c  r
22 clean::
23     make -C host clean
24     make -C dsp clean
./dsp/makefile
' E6 e* Q9 h0 d
1 srcs = main_dsp.c Server.c                    # 在此加入 c 代码文件
2 objs = $(patsubst %.c,%.oe674,$(srcs))
3 libs = configuro/linker.cmd# f- K  N& C% D: l: y' ]- G: p7 H

5 all: configuro/linker.cmd
6     make server_dsp.xe674

8 server_dsp.xe674: $(objs) $(libs)
9     $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
10 ) x( ~% b  M3 d9 F$ _' P
11 %.oe674: %.h+ V* d9 E2 [2 q8 L3 z
12 %.oe674: %.c) u$ l' D- ~9 Y
13     $(CC) $(CPPFLAGS) $(CFLAGS) --output_file=$@ -fc $<$ D  j9 g4 c: _: X
14 0 c7 [; b9 L2 ?0 W+ u) X9 T
15 configuro/linker.cmd: Dsp.cfg ../shared/config.bld
16     $(XDC_INSTALL_DIR)/xs --xdcpath="$(subst +,;,$(PKGPATH))"      
17             xdc.tools.configuro -o configuro                        
18             -t ti.targets.elf.C674 -c $(CGT_C674_ELF_INSTALL_DIR)   & x8 f" s- [) J; T
19             -p ti.platforms.evmOMAPL138:dsp -b ../shared/config.bld 0 |% g* A7 R# u( {% X8 U* M
20             -r release Dsp.cfg
21 
22 clean::6 J7 L- q- o% K
23     rm -rf configuro *.oe674  *.map server_dsp.xe674
24 
25 PKGPATH := $(SYSLINK_INSTALL_DIR)/packages3 w) E2 q9 d1 _4 S
26 PKGPATH := $(PKGPATH)+$(BIOS_INSTALL_DIR)/packages
27 PKGPATH := $(PKGPATH)+$(IPC_INSTALL_DIR)/packages
28 PKGPATH := $(PKGPATH)+$(XDC_INSTALL_DIR)/packages$ v1 x" W4 Y* P- a6 P) x
29 
30 CGTOOLS = $(CGT_C674_ELF_INSTALL_DIR)- e% }4 {% N. x& _* ]5 e( j5 K
31 % R0 x' ~3 n$ a
32 CC = $(CGTOOLS)/bin/cl6x -c                         
33 AR = $(CGTOOLS)/bin/ar6x rq
34 LD = $(CGTOOLS)/bin/lnk6x --abi=eabi
35 ST = $(CGTOOLS)/bin/strip6x& g7 w+ C4 P7 c& A2 G6 V
36 7 p# L1 ?' I, D; s
37 CPPFLAGS =
38 CFLAGS = -qq -D_DEBUG_=1 --symdebug:dwarf -I. $(COMPILER_OPTS)# C- }! g. R  w( w
39   U( E/ I! z6 F- C
40 COMPILER_OPTS = $(shell cat configuro/compiler.opt)+ x# Y) ?& @  {/ B
41 1 y* c8 B) ?5 o0 _
42 LDFLAGS = -w -q -c -m $(@D)/$(@F).map     
43 LDLIBS  = -l $(CGTOOLS)/lib/rts6740_elf.lib    # 在此添加需要用到的库,如果库之间有相互依赖,需要注意其添加顺序
./host/makefile/ x; W: z# ?8 f
! T- Y7 ~1 _- @1 Q$ |1 d. R
1 srcs = main_host.c App.c                       # 在此加入 c 代码文件" c2 D) M! C: k$ X+ s% n
2 objs = $(patsubst %.c,%.ov5T,$(srcs))
3 libs = $(SYSLINK_INSTALL_DIR)/packages/ti/syslink/lib/syslink.a_debug+ P' V/ N. I. m2 M" v, T

5 -include $(patsubst %.c,%.ov5T.dep,$(srcs))

7 all:# l# a5 K; / r) G8 M
8     $(MAKE) app_host
& l8 ^: Y4 K# }$ [- `
10 clean::
11     rm *.ov5T* *.map app_host% U; _" s. i- n
12 7 R! g1 _* s6 F5 K( p0 C
13 app_host(objs) $(libs)
14     $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
15 
16 %.ov5T: %.c
17     $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $<9 y7 C8 x& r4 ^! ~
18 
19 CC = $(CGT_ARM_PREFIX)gcc -c -MD -MF $@.dep -march=armv5t
20 AR = $(CGT_ARM_PREFIX)ar cr
21 LD = $(CGT_ARM_PREFIX)gcc
22 2 p! ^6 ?3 v: B, ]+ z  B
23 CPPFLAGS = -D_REENTRANT -Dxdc_target_name__=GCArmv5T
24            -Dxdc_target_types__=gnu/targets/arm/std.h# |4 _  Y  m8 `, n0 D  {
25   F, T$ V& O7 {, Q- F6 ~$ F
26 CFLAGS = -Wall -ffloat-store  -fPIC -Wunused -Dfar= -ggdb -D DEBUG # 在此添加头文件的搜索路径
27          -I $(SYSLINK_INSTALL_DIR)/packages                        
28          -I $(BIOS_INSTALL_DIR)/packages                           
29          -I $(IPC_INSTALL_DIR)/packages. H' N% _) I% V& L
30 
31 LDFLAGS = -ggdb -Wall -Wl,-Map=$@.map
32 LDLIBS = -lpthread -lc -lrt                    # 在此添加需要用到的库,如果库之间有相互依赖,需要注意其添加顺序/ h) D) V. p& S! N2 C% N6 B
编译工程

 makefile 文件编写好后,编译工程只需要打开终端,进入 ex01_helloworld 目录并运行 “make” 这个命令就可以了。如果编译成功,我们将得到在 DSP 端运行的 ./dsp/server_dsp.xe674 和在 ARM 端 Linux 下运行的 ./host/app_host 这两个可执行文件。+ H+ O) o# Q2 Q! d6 v/ r3 }4 I

运行工程
3 ?* A/ w7 O, f3 m0 |
 要运行一个双核工程,需要在目标机器上分别运行 ARM 和 DSP 的两个程序。

1. insmod syslink.ko                    # 加载 syslink 内核模块/ M3 v$ n: b% b: [) V! p  F2 i
2. slaveloader startup DSP dsp_app      # 加载并运行 DSP 端程序
3. arm_app                              # 运行 ARM 端程序# z, T2 X$ k) V2 w4 h
4. slaveloader shutdown DSP             # 停止 DSP 端程序& w4 N5 ]3 X) h& ]5 g
 sylink.ko 和 slaveloader 我们可以在编译 MCSDK 时得到。 
 为了方便运行工程,我们在 ex01_helloworld 目录下建立一个 run 目录,在其中放置 sylink.ko、slaveloader 和 run.sh,启动程序时,运行 run.sh 就可以了。/ m6 b. C* f/ |# g
1 E( c- m+ h& @0 G; G5 T
1 #!/bin/sh

3 set -x

5 insmod syslink.ko" a+ {# p) U6 a. N6 i4 F
* q3 z( ]9 i6 q( b2 l
7 ./slaveloader startup DSP ../dsp/server_dsp.xe674

9 ../host/app_host DSP
10 3 d& J% ~8 D; {! ~% l& v+ r
11 ./slaveloader shutdown DSP0