API

タスクの生成

create_task関数

タスクを生成する

tid_t create_task(void (*func)(void))
  • 引数
    • void (*func)(void)
      • 実行したい関数のポインタ
  • 返り値
    • タスクID

create_task_rt関数

周期タスクを生成する

tid_t create_task_rt(int priority, ulong_t period, void (*func)(void))
  • 引数
    • int priority
      • 優先度
      • 64レベルの設定が可能で、0が最高優先度
    • ulong_t period
      • 周期
      • 単位はマイクロ秒
    • void (*func)(void)
      • 実行したい関数のポインタ
  • 返り値
    • タスクID

create_task_at関数

周期タスクを生成する。create_task_rt関数とは違い、この関数で生成されたタスクはOSのスケジューラで管理されない。このタスクの起床はすべてHWで管理されるため、スケジューラのオーバーヘッドがない。ただし、このタスクは8つあるコンテキストの1つを占領する。そのため、この関数を呼びすぎると、通常のタスクを実行するために必要なコンテキストが不足してしまう可能性がある。

tid_t create_task_at(int priority, ulong_t period, void (*func)(void))
  • 引数
    • int priority
      • 優先度
      • 64レベルの設定が可能で、0が最高優先度
    • ulong_t period
      • 周期
      • 単位はマイクロ秒
    • void (*func)(void)
      • 実行したい関数のポインタ
  • 返り値
    • タスクID

DMA

priorityの設定

dma_set_priority(int p)
  • 1:round robin (default)
  • 2:ch0>ch1>ch2>ch3

DMA終了の確認

dma_check(int ch)
  • 指定したチャネルのDMAが終了するまでループを回す
  • ch
    • チャネルの指定

DMAの実行

メモリ間の転送

dma_m2m(int ch, unsigned long s_addr, unsigned long d_addr, unsigned long length)
  • ch
    • チャネルの指定
  • s_addr
    • source address
  • d_addr
    • destination_address
  • length
    • 転送数(byte)

ROMからSDRAMの転送

dma_rom2sdram(int ch, unsigned long s_addr, unsigned long d_addr, unsigned long length)
  • ch
    • チャネルの指定
  • s_addr
    • source address
  • d_addr
    • destination_address
  • length
    • 転送数(byte)

I/O,メモリ間の転送

dma_[a]2[b][c](int ch, unsigned long s_addr, unsigned long d_addr, unsigned long length)
  • [a]
    • sourceの指定
      • io:I/O
      • m:メモリ
  • [b]
    • destinationの指定
      • io:I/O
      • m:メモリ
  • [c]
    • I/O portが何bitであるか
  • ch
    • チャネルの指定
  • s_addr
    • source address
  • d_addr
    • destination_address
  • length
    • 転送数(byte)
  • 例([a]=m,[b]=io,[c]=16の場合)
    dma_m2io16(int ch, unsigned long s_addr, unsigned long d_addr, unsigned long length)

セマフォの利用

down_sem関数

ソフトウェアセマフォを獲得する

down_sem(semaphore_t *sem)
  • 引数
    • セマフォの構造体のポインタ

up_sem関数

ソフトウェアセマフォを解放する

up_sem(semaphore_t *sem)
  • 引数
    • セマフォの構造体のポインタ

rgpex関数

ハードウェアセマフォを獲得し共有データをREAD

rgpex(ulong_t gpreg, ulong_t shreg)
  • 引数
    • 共有するデータの値
    • 共有レジスタ番号

wgpex関数

ハードウェアセマフォを解放し共有データをWRITE

wgpex(ulong_t gpreg, ulong_t shreg)
  • 引数
    • 共有するデータの値
    • 共有レジスタ番号

Serial

シリアルに文字列を出力

出力ポートは0に固定。

printk(*format, ...);
  • format一覧
    • d
    • x
    • f
    • s
    • c

シリアルに文字列を出力2

出力ポートは0に固定。変数は出力できない。

printk(*str);

シリアルから1バイト受信

unsigned char serial_getc(int ch);
  • 引数
    • int ch
      • 入力ポート。0か1を指定する。
  • 返り値
    • 受信したデータ

シリアルに1バイト送信

void serial_putc(int ch, unsigned char data);
  • 引数
    • int ch
      • 出力ポート。0か1を指定する。
    • int data
      • 出力するデータ

PIO

PIOを初期化

pio_setup(void)

PIOに出力

pio_put(unsigned long data)

SPI

SPIを初期化

spi_init(ulong_t slave_num)

SPIに出力する

spi_put(ulong_t slave_num, ulong_t data)

PWM

PWMを初期化

void pwmgen_init(int ch)
  • 引数
    • int ch
      • ポートを指定する

PWMを開始

pwmgen_start(int ch, ulong_t cycle, ulong_t reversetime, int deadtime, int way)
  • 引数
    • int ch
    • ulong_t cycle
      • 周期
    • ulong_t reversetime
      • PWM 出力を反転する時間
    • int deadtime
      • デッドタイムを指定
    • int way
      • PWM 波の論理を決定
      • 正論理:1
      • 負論理:0

PWMを停止

pwmgen_stop(int ch)

PWMをクリア

pwmgen_clear(int ch)

PWMに値をセット

pwmgen_set(int ch, int reversetime)
  • 引数
    • int ch
      • 出力ポート
    • ulong_t reversetime
      • PWM 出力を反転する時間

パルスカウンタ

パルスカウンタを初期化

plscntr_init(int ch)

パルスカウンタを開始

plscntr_start(int ch)

パルスカウンタのカウントレジスタを読む

ulong_t plscntr_count_read(int ch);

パルスカウンタのコントロールレジスタを読む

ulong_t plscntr_control_read(int ch);

パルスカウンタのコントロールレジスタに書く

plsctnr_write(int ch, ulong_t data)