体験!マイコンボードで組込みLinux

第6回 BusyBoxの活用[後編]

この記事を読むのに必要な時間:およそ 4 分

前回はBusyBoxの概要について説明しました。今回は実際に自作のアプリケーションをBusyBoxに追加する方法を紹介します。

独自のアプリケーションの追加

組込み対象プログラム

T-SH7706LSRは制御用組込みボードコンピュータであるので,直接にハードウェアを叩きI/O制御をする独自のアプリケーションプログラムを追加しています。

T-SH7706LSRにはLEDが付属していますので,具体的にはT-SH7706LSRにはLEDを点滅させるような直接にハードウェアを叩きI/O制御をする独自のアプリケーションプログラムを追加してみます。もととなるプログラムはリスト1となり,コマンド名はledで,第1引数の回数だけLEDが点滅するという仕様となっています。基本的にはリスト1をBusyBoxに組込むわけですが,このままではBusyBoxに組み込むことができないので,BusyBoxに組み込める形式に変更をします。

リスト1 ledプログラム(元)

 1	#include <sys/types.h>
 2	#include <sys/stat.h>
 3	#include <fcntl.h>
 4	#include <unistd.h>
 5	#include <stdlib.h>
 6	#include <stdio.h>
 7	#include <string.h>
 8	#include <sys/mman.h>
 9	
10	#include <asm/page.h>
11	
12	#define SCPDR	0x136
13	#define LED	0x10
14	
15	int main(int argc, char **argv) {
16		volatile unsigned char	*mmaped;
17		int			fd, i, n;
18	
19		if(argc > 2) return -1;
20		n = 5;
21		if(argc == 2) n = atoi(argv[1]);
22		fd = open("/dev/mem",O_RDWR);
23		if(fd < 0) {
24			fprintf(stderr,"cannot open /dev/mem\n");
25			return 1;
26		}
27		mmaped = (volatile unsigned char*)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xa4000000);
28		close(fd);
29		if(mmaped == MAP_FAILED) {
30			fprintf(stderr,"cannot mmap\n");
31			return 1;
32		}
33	
34		for(i = 0;i < n;i++) {
35			mmaped[SCPDR] |= LED;
36			sleep(1);
37			mmaped[SCPDR] &= ~LED;
38			sleep(1);
39		}
40	
41		munmap((char*)mmaped, PAGE_SIZE);
42		return 0;
43	}

個別アーキテクチャに依存するヘッダは別ですが,基本的にはヘッダの定義が不要なので,ヘッダ定義をとり除き,その代わりlibbb.hを定義します。

また,main関数も

コマンド名_main

というように変更し,MAIN_EXTERNALLY_VISIBLE属性を追加します。

戻り値に関してもBusyBoxではいろいろな定義がありますが,成功の値はEXIT_SUCCESS,失敗の値はEXIT_FAILUREとなります。そのようにして変更をしたプログラムがリスト2となります。

リスト2 ledプログラム(修正版)

 1	#include "libbb.h"
 2	#include <asm/page.h>
 3	
 4	#define SCPDR	0x136
 5	#define LED	0x10
 6	
 7	int led_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 8	int led_main(int argc, char **argv) {
 9		volatile unsigned char	*mmaped;
10		int			fd, i, n;
11	
12		if(argc > 2) return EXIT_FAILURE;
13		n = 5;
14		if(argc == 2) n = atoi(argv[1]);
15		fd = open("/dev/mem",O_RDWR);
16		if(fd < 0) {
17			fprintf(stderr,"cannot open /dev/mem\n");
18			return 1;
19		}
20		mmaped = (volatile unsigned char*)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0xa4000000);
21		close(fd);
22		if(mmaped == MAP_FAILED) {
23			fprintf(stderr,"cannot mmap\n");
24			return 1;
25		}
26	
27		for(i = 0;i < n;i++) {
28			mmaped[SCPDR] |= LED;
29			sleep(1);
30			mmaped[SCPDR] &= ~LED;
31			sleep(1);
32		}
33	
34		munmap((char*)mmaped, PAGE_SIZE);
35		return EXIT_SUCCESS;
36	}

今回はリスト2のプログラムを,BusyBoxの中にmyappsというフォルダを新規作成して入れることにします。

著者プロフィール

みついわゆきお

1986年日立製作所入所,その3年後に自社ワークステーションでの開発業務をきっかけにBSDを経てLinux利用を始める。

1991年日立を退社し,その後,ボランティアでLinux関連ツールの整備と開発しながらWindows否定運動およびLinux普及運動を開始し,Linuxディストリビューション草創期にはPlamoLinuxのメンテナンスにもかかわる。

2001年ごろより非営利ベースでボードコンピュータの開発を開始し,やがて,無償によりハードとソフトを開発したH8マイコンボードの販売を秋月電子にて開始した。

現在,ボードコンピュータ用基本ソフトMES2.5や,SHプロセッサ向けLinuxパッチおよびTOPPERS/JSPパッチを無償で一般に提供しながら,ティーエーシーやエムイーシステムより原価率100%を目標(ただし,販売店の営業・販売費用や開発・製造の際の差損を除く)としたSuperHボードコンピュータを販売中。

また,現在でも頑固にMS社否定及びWindows撲滅運動に邁進中。

コメント

コメントの記入