RaspberryPi
SSP
TOPPERS
カーネル
活用アイデア・アプリケーション開発コンテスト

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

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活用アイデア・アプリケーション開発コンテスト」への道

https://researchmap.jp/jovr40j3b-1778110/?block_id=1778110&active_action=journal_view_main_detail&post_id=38687&comment_flag=1

文書履歴(document history)

ver. 0.10 初稿 20180623