1
0

TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(10)第五回(2015)アプリケーション開発部門 銅賞シュリンク版TOPPERS/SSPとそれを利用した タミヤラジコン改造RaspberryPiスマホリモコンカー アライブビジョンソフトウェア株式会社(代表:髙橋和浩)

Last updated at Posted at 2018-06-23

TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html

「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。

なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清 の 技術者個人の考えに基づいています。

目的(purpose)

TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
#成果(outcome)

応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。ソースコードを一度コンパイルしたくなる。自分も良い作品を作ろうという気になる。

TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介(10)第五回(2015)アプリケーション開発部門 銅賞

##シュリンク版TOPPERS/SSPとそれを利用した タミヤラジコン改造RaspberryPiスマホリモコンカー アライブビジョンソフトウェア株式会社(代表:髙橋和浩)

応募資料(application material)等

コンテスト応募資料
https://www.toppers.jp/docs/contest/2015/シュリンク版TOPPER%EF%BC%8FSSSPとそれを利用したタミヤラジコン改造RaspberryPiスマホリモコンカー.pdf

Download

ソースコード
https://github.com/alvstakahashi/SHRINK-SSP-KERNEL-ONLY
master ブランチが待ち無/ WAIT-SSP ブランチが待ち有

RaspberryPi 版
https://github.com/alvstakahashi/RPI-SHRINK-SSP-FULL

GR-SAKURA 版 HEW シミュレータ版 https://github.com/alvstakahashi/RX62N-WAIT-SSP-HEWSIM
「ターゲットは GR-SAKURA にしていますが、HEW のシミュレータで、実機無で動作確 認できます。」

関連資料(related URL)

シュリンク版GitHub
https://github.com/alvstakahashi

Raspberry Pi用 TOPPERS/ssp シュリンク版の紹介 slideshare
https://www.slideshare.net/alvstakahashi/raspberry-pi-toppers-ssp

カーネルソースの歩き方 RaspberryPi演習 - SWEST
https://swest.toppers.jp/SWEST17/data/s5d_proceeding.pdf

TOPPERS/SSPを動かしてみる (HEWシミュレータ編 - SWEST 2014
https://swest.toppers.jp/SWEST16/data/s4a_proceeding.pdf

さわってみようTOPPERS/SSP
https://www.slideshare.net/NSaitoNmiri/toppers-ssp-34024303

TOPPERS/sspカーネルソースの勉強会第七回の記録
https://researchmap.jp/joafr3udo-1778110/

算譜(source code)

github.com/alvstakahashi/RPI-SHRINK-SSP-FULL/blob/master/SSP_TimerIRQ/main.c
#include <kernel.h>
#include "kernel_cfg.h"

#include "rpi_lib/rpi.h"
#include <stdio.h>
#include <stdint.h>

#include "kernel_impl.h"
#include "target_kernel.h"

#if defined(RPIBPLUS) || defined(RPI2) || defined(RPI3)
#define	LED_ACT_PIN	47	//TYPE B PLUS
#else
#define LED_ACT_PIN	16	//TYPE B
#endif


#define CORE0_IRQ_SOURCE 	0x40000060
#define INT_SRC_GPU 		0x00000100			//なぜかタイマー割り込み

volatile int count = 0;

#ifndef RPI3
void set_vector_table(void){
	extern void *_initial_vector_start;
	extern void *_initial_vector_end;
	// volatileをつけないと最適化に消される(涙目)
	volatile unsigned int *vec = 0;
	volatile unsigned int *p;
	volatile unsigned int *s = (unsigned int *)&_initial_vector_start;
	volatile unsigned int *e = (unsigned int *)&_initial_vector_end;

	printf("Vector table check\n");
	printf("Addr : Hex\n");
	for (p = s; p < e; p++) {
		*vec = *p;
		printf("0x%02x : 0x%08x\n",vec,*vec);
		vec++;
	}
}
#endif

extern void _kernel_handler(INTHDR userhandler);
extern void isig_tim(void);

// IRQ割り込みハンドラ
void IRQ_handler(void)
{
#ifdef RPI3
	target_hrt_int_clear();

	// Basic IRQ pendingをチェック
//	if(*INTERRUPT_IRQ_BASIC_PENDING & 0x01 != 0)
	if ((*(unsigned int*)CORE0_IRQ_SOURCE & INT_SRC_GPU) != 0)
	{
		// タイマー割り込み
        // 割り込みフラグクリア
        *TIMER_IRQ_CLR = 0;

		_kernel_handler(isig_tim);
	}
#else
	// Basic IRQ pendingをチェック
	if(*INTERRUPT_IRQ_BASIC_PENDING & 0x01 != 0)
	{
		// タイマー割り込み
        // 割り込みフラグクリア
        *TIMER_IRQ_CLR = 0;

		_kernel_handler(isig_tim);
	}
#endif
	return;
}


int setup(void)
{
	rpi_init();

	// 起動確認用
	pinMode(LED_ACT_PIN,OUTPUT);
	digitalWrite(LED_ACT_PIN, LOW);

#ifndef RPI3
	// ベクタテーブルセット
	set_vector_table();
#endif

	// すべての割り込み不許可
	*INTERRUPT_DISABLE_BASIC_IRQS = 0xffffffff;
	*INTERRUPT_DISABLE_IRQS1 = 0xffffffff;
	*INTERRUPT_DISABLE_IRQS2 = 0xffffffff;
	*INTERRUPT_FIQ_CTRL = 0;

	// タイマ割り込み設定
	*INTERRUPT_ENABLE_BASIC_IRQS = 0x01;

	// 設定のため一旦タイマー停止
	*TIMER_CONTROL &= 0xffffff00;

	// timer clock を1MHzに設定
	//(0xF9=249: timer clock=250MHz/(249+1))
	*TIMER_PREDIVIDER = 0x000000F9;

	// タイマー値設定(4sec)
//	*TIMER_LOAD = 4000000-1;
//	*TIMER_RELOAD = 4000000-1;
	// タイマー値設定(1msec)
	*TIMER_LOAD = 1000-1;
	*TIMER_RELOAD = 1000-1;

	// 割り込みフラグをクリア
	*TIMER_IRQ_CLR = 0;

	// タイマー開始
	// Timer enable, 32bit Timer
	*TIMER_CONTROL |= 0x000000A2;
#ifdef RPI3
	target_hrt_initialize(0);
#endif

	// 割り込み許可
	*INTERRUPT_ENABLE_BASIC_IRQS = 0x01;

	// IRQ許可
	enable_IRQ();

	sta_ker();

	while(1);
//
//	return 0;
}
void main(intptr_t arg)
{
	printf("main here\n");
	act_tsk(TASK3_ID);
	act_tsk(TASK2_ID);	
	printf("main end\n");
}
void task2(intptr_t arg)
{
	int toggle= 0;
	printf("task2 RUNNING-----------------------------------------------------\n");
	for(;;)
	{
		if ((toggle ^= 1) != 0)
		{
			printf("TASK2 LED: ON count= %d\n",count);
			digitalWrite(LED_ACT_PIN, HIGH);
		}
		else
		{
			printf("TASK2 LED: OFF count= %d\n",count);
			digitalWrite(LED_ACT_PIN, LOW);
		}
		dly_tsk(1000);
	}
}

void task3(void)
{
	printf("task3-----------------\n");
	for(;;)
	{
		dly_tsk(500);
		count++;
		printf("task3-----------------\n");
	}
}


参考資料(reference)

「TOPPERS活用アイデア・アプリケーション開発コンテスト受賞作品紹介」まとめ
https://qiita.com/kaizen_nagoya/items/72b882d96b2841f25faf

TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931

「TOPPERS活用アイデア・アプリケーション開発コンテスト」への道

文書履歴(document history)

ver. 0.10 初稿 20180623

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0