LoginSignup
0
0

More than 1 year has passed since last update.

Da Vinci (Atmega32u4) でFreeRTOSを動かす

Last updated at Posted at 2022-08-15

USBデバイスの試作をするため、ストロベリーLinuxさんのDa VinciボードにFreeRTOSを乗せました。
FreeRTOSの本家サイトからGCC-Atmegaのソースを持ってきて移植しようとすると色々作らないといけない関数があるので、いくつかあるパッケージのうちminiAVRfreeRTOSさんのお力を借りることにしました。

開発環境はMacOS MontereyにvmWareFusionでwindows10を乗せて、その上でMicrochip Studio 7を動かしています。デバッガはAtmel ICE3で、USBをWindows側に設定しています。最初はMac上でMPLABを動かしてみたのですが、論理フォルダというのがよくわからないのと、デバッガがうまく繋がらなかったので諦めました。

[File]->[New]->[Project]でGCC Executableプロジェクトを作成。次の画面のデバイスはAtmega32u4を選択。
スクリーンショット 2022-08-15 15.48.56.png

FreeRTOSのフォルダを作って、githubから頂いたソースをコピー。
スクリーンショット 2022-08-15 15.51.01.png

プロジェクトエクスプローラでGccApplicationを右クリックしてpreferenceを出して、コンパイラオプションの設定。
ToolchainのインクルードパスにFreeRTOSを追加。このとき、All Categoryを選択しておきます(スクショではうっかりDebugのままになっています)。
スクリーンショット 2022-08-15 15.52.21.png

SymbolにF_CPU=16000000を追加
スクリーンショット 2022-08-15 15.53.06.png

ターゲットがAtmega328pの場合はこのままコンパイルが通ります。しかしAtmega32u4はシリアルポート0がないので、hooks.cのvApplicationStackOverflowHook()で使っているシリアルポートのシンボルでエラーが出ます。
スクリーンショット 2022-08-15 15.53.37.png

そこで他の関数に習って、vApplicationStackOverflowHookの下あたりに

hook.s
#ifdef __AVR_ATmega32U4__
	#define UCSR0A UCSR1A
	#define UCSR0B UCSR1B
	#define UCSR0C UCSR1C
	#define UCSZ00 UCSZ10
	#define UCSZ01 UCSZ11
	#define UBRR0 UBRR1
	#define UDR0 UDR1
	#define UDRE0 UDRE1
	#define TXEN0 TXEN1
#endif

と追加してやります。またhooks.cにstring.hがない、と言われているのでこれも追加しておきます。ここでコンパイルしてみると、FreeRTOSの関数を使っていないmainでFreeRTOS部分のコンパイルが通ることが確認できます。

このパッケージはデフォルトではTickスライスにWDTをつかっており、デフォルトは15msecに設定されています。vTickDelay()の引数はティック数なので、1/0.015=66.6で一秒になります。またDa VinciのLEDはPC7に繋がっているので出力ポートをそこに指定します。

テストしたメインはこんな感じです。

hook.s
#include <avr/io.h>
#include "FreeRTOS.h"
#include "task.h"

void vTask1( void *pvParameters )
{
	for(;;)
	{
		PORTC ^= 0x80;
		vTaskDelay(67);
	}
}

int main(void)
{
	TaskHandle_t xHandle = NULL;
	
	//Enable LED(PC7) OUT
	DDRC = 0x80;
	
	//Create task
	xTaskCreate(vTask1,"Blink",512, (void *) 1, 1, &xHandle);
	
	//Exec Task
	vTaskStartScheduler();

	for(;;);
}


ビルドの結果はこんな感じです。メモリの使用量はROMが7kbyte(搭載32k), RAMが161byte(搭載2.5k)となっていました。

スクリーンショット 2022-08-15 15.58.46.png

JTAGの結線は
1->PF4(TCK)
2->GND
3->PF6(TDO)
4->5V
5->PF5(TMS)
6->~RST
7->NC
8->NC
9->PF7(TDI)
10->NC(GND)
でおこなっています。

IMG_2989.png

Microcip Studioがいつまで提供されるかわからないので、MPLABのフォルダ周りやデバッガエラーの回避を模索しつつ、今回はこれで進めようと思っております。

本家のソースをとってきて始めたものの、足りない関数のコーディング途中で力尽きてしまいました。先人の知恵に感謝であります。

0
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
0
0