前回に引き続き、以下のチュートリアルの追試行を行う。
BeagleBone Black: Introduction to PRU-ICSS
Example 2 – PRU0 PWM
ここでのPWMはAM335xのペリフェラルとしてのPWMではなく、PRUでソフト的にPWMを生成するもの。
ARM Coretex-A8側からの連携例として、10msec毎にUser-Landでsin波形を生成し、10msec毎に値を書き換える事により正弦波波形を出力する。
使用するポートはExample 1と同じpr1_pru0_pru_r30[14]/GPIO1[12]で、LEDを接続しておくと点滅ではなく緩やかに明滅するはずだ。
手順をなぞる。
サンプルの取得と開梱。
debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/led/obj$ cd ../.. debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ mkdir pwm debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ cd pwm/ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ wget http://analogdigitallab.org/sites/default/files/pwm.zip --2014-10-21 14:32:11-- http://analogdigitallab.org/sites/default/files/pwm.zip Resolving analogdigitallab.org (analogdigitallab.org)... 188.93.153.77 Connecting to analogdigitallab.org (analogdigitallab.org)|188.93.153.77|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 14438 (14K) [application/zip] Saving to: `pwm.zip' 100%[======================================>] 14,438 51.3K/s in 0.3s 2014-10-21 14:32:12 (51.3 KB/s) - `pwm.zip' saved [14438/14438] ebian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ unzip pwm.zip Archive: pwm.zip inflating: pwm.bin inflating: pwm.c inflating: pwm.hp inflating: pwm.p inflating: pwm debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$
ソースとDIRSとMakefileの修正。
debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ mkdir obj debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ cp ./pwm.c ./pwm.c.backup debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ nano -w pwm.c debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ diff -u ./pwm.c ./pwm.c.backup --- ./pwm.c 2014-10-21 14:51:49.702172738 +0000 +++ ./pwm.c.backup 2014-10-21 14:50:17.399438352 +0000 @@ -87,7 +87,7 @@ prussdrv_pru_wait_event(PRU_EVTOUT_0); printf("\tINFO: PRU completed transfer.\r\n"); - prussdrv_pru_clear_event(PRU_EVTOUT_0,PRU0_ARM_INTERRUPT); + prussdrv_pru_clear_event(PRU0_ARM_INTERRUPT); // Disable PRU and close memory mapping prussdrv_pru_disable(PRU_NUM); debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ cd .. debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ nano -w DIRS debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ cat DIRS APP_DIRS := APP_DIRS += PRU_memAccess_DDR_PRUsharedRAM APP_DIRS += PRU_memAccessPRUDataRam APP_DIRS += PRU_PRUtoPRU_Interrupt APP_DIRS += led APP_DIRS += pwm ASSEM_FILES := ASSEM_FILES += PRU_memAccess_DDR_PRUsharedRAM/PRU_memAcc_DDR_sharedRAM.p ASSEM_FILES += PRU_memAccessPRUDataRam/PRU_memAccessPRUDataRam.p ASSEM_FILES += PRU_PRUtoPRU_Interrupt/PRU_PRU0toPRU1_Interrupt.p ASSEM_FILES += PRU_PRUtoPRU_Interrupt/PRU_PRU1toPRU0_Interrupt.p ASSEM_FILES += led/led.p ASSEM_FILES += pwm/pwm.p BIN_FILES := BIN_FILES += PRU_memAcc_DDR_sharedRAM.bin BIN_FILES += PRU_memAccessPRUDataRam.bin BIN_FILES += PRU_PRU0toPRU1_Interrupt.bin BIN_FILES += PRU_PRU1toPRU0_Interrupt.bin BIN_FILES += led.bin BIN_FILES += pwm.bin debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ cd pwm/ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ cp ../led/Makefile ./ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ nano -w Makefile debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ diff -u ../led/Makefile ./Makefile --- ../led/Makefile 2014-10-21 13:40:34.881859728 +0000 +++ ./Makefile 2014-10-21 15:13:55.946313521 +0000 @@ -5,14 +5,14 @@ BINDIR?=../bin CFLAGS+= -Wall -I$(INCDIR_APP_LOADER) -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -LDFLAGS+=-L$(LIBDIR_APP_LOADER) -lprussdrv -lpthread +LDFLAGS+=-L$(LIBDIR_APP_LOADER) -lprussdrv -lpthread -lm OBJDIR=obj -TARGET=$(BINDIR)/led +TARGET=$(BINDIR)/pwm _DEPS = DEPS = $(patsubst %,$(INCDIR_APP_LOADER)/%,$(_DEPS)) -_OBJ = led.o +_OBJ = pwm.o OBJ = $(patsubst %,$(OBJDIR)/%,$(_OBJ)) debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$
math.hをリンクするためにとりあえずLDFLAGSに-lmを付与している。
makeを実行。
debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm$ cd .. debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ make clean for dir in PRU_memAccess_DDR_PRUsharedRAM PRU_memAccessPRUDataRam PRU_PRUtoPRU_Interrupt led pwm; do make -C $dir clean LIBDIR_APP_LOADER="../../app_loader/lib" LIBDIR_EDMA_DRIVER="" INCDIR_APP_LOADER="../../app_loader/include" INCDIR_EDMA_DRIVER="" BINDIR="../bin"; done make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccess_DDR_PRUsharedRAM' rm -rf obj/ *~ ../../app_loader/include/*~ ../bin/PRU_memAcc_DDR_sharedRAM make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccess_DDR_PRUsharedRAM' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccessPRUDataRam' rm -rf obj/ *~ ../../app_loader/include/*~ ../bin/PRU_memAccessPRUDataRam make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccessPRUDataRam' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_PRUtoPRU_Interrupt' rm -rf obj/ *~ ../../app_loader/include/*~ ../bin/PRU_PRUtoPRU_Interrupt make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_PRUtoPRU_Interrupt' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/led' rm -rf obj/ *~ ../../app_loader/include/*~ ../bin/led make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/led' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/pwm' rm -rf obj/ *~ ../../app_loader/include/*~ ../bin/pwm make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/pwm' for bin_file in PRU_memAcc_DDR_sharedRAM.bin PRU_memAccessPRUDataRam.bin PRU_PRU0toPRU1_Interrupt.bin PRU_PRU1toPRU0_Interrupt.bin led.bin pwm.bin; do rm -fr bin/$bin_file; done debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ make mkdir -p bin for dir in PRU_memAccess_DDR_PRUsharedRAM PRU_memAccessPRUDataRam PRU_PRUtoPRU_Interrupt led pwm; do make -C $dir CROSS_COMPILE="" LIBDIR_APP_LOADER="../../app_loader/lib" LIBDIR_EDMA_DRIVER="" INCDIR_APP_LOADER="../../app_loader/include" INCDIR_EDMA_DRIVER="" BINDIR="../bin"; done make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccess_DDR_PRUsharedRAM' gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -c -o obj/PRU_memAcc_DDR_sharedRAM.o PRU_memAcc_DDR_sharedRAM.c gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -o ../bin/PRU_memAcc_DDR_sharedRAM obj/PRU_memAcc_DDR_sharedRAM.o -L../../app_loader/lib -lprussdrv make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccess_DDR_PRUsharedRAM' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccessPRUDataRam' gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -c -o obj/PRU_memAccessPRUDataRam.o PRU_memAccessPRUDataRam.c gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -o ../bin/PRU_memAccessPRUDataRam obj/PRU_memAccessPRUDataRam.o -L../../app_loader/lib -lprussdrv make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_memAccessPRUDataRam' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_PRUtoPRU_Interrupt' gcc -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -c -o obj/PRU_PRUtoPRU_Interrupt.o PRU_PRUtoPRU_Interrupt.c gcc -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -o ../bin/PRU_PRUtoPRU_Interrupt obj/PRU_PRUtoPRU_Interrupt.o -L../../app_loader/lib -lprussdrv make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/PRU_PRUtoPRU_Interrupt' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/led' gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -c -o obj/led.o led.c gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -o ../bin/led obj/led.o -L../../app_loader/lib -lprussdrv -lpthread make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/led' make[1]: Entering directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/pwm' gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -c -o obj/pwm.o pwm.c gcc -Wall -I../../app_loader/include -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -o ../bin/pwm obj/pwm.o -L../../app_loader/lib -lprussdrv -lpthread -lm make[1]: Leaving directory `/home/debian/pru/am335x_pru_package/pru_sw/example_apps/pwm' for a_file in PRU_memAccess_DDR_PRUsharedRAM/PRU_memAcc_DDR_sharedRAM.p PRU_memAccessPRUDataRam/PRU_memAccessPRUDataRam.p PRU_PRUtoPRU_Interrupt/PRU_PRU0toPRU1_Interrupt.p PRU_PRUtoPRU_Interrupt/PRU_PRU1toPRU0_Interrupt.p led/led.p pwm/pwm.p ; \ do \ ../utils/pasm_2 -V3 -b $a_file ; \ done ; \ mv *.bin bin PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 16 word(s) PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 14 word(s) PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 16 word(s) PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 14 word(s) PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 19 word(s) PRU Assembler Version 0.86 Copyright (C) 2005-2013 by Texas Instruments Inc. Pass 2 : 0 Error(s), 0 Warning(s) Writing Code Image of 25 word(s)
pwm.outを生成させる。
debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps$ cd bin/ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/bin$ cp ./pwm.bin ../pwm/obj/ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/bin$ cd ../pwm/obj/ debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm/obj$ gcc pwm.o -L../../../app_loader/lib -lprussdrv -lpthread -lm -o pwm.out debian@beaglebone:~/pru/am335x_pru_package/pru_sw/example_apps/pwm/obj$ sudo ./pwm.out
今度はLEDが明るくなったり暗くなったりを繰り返す。
サンプルの実行は成功。