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を選択。
FreeRTOSのフォルダを作って、githubから頂いたソースをコピー。
プロジェクトエクスプローラでGccApplicationを右クリックしてpreferenceを出して、コンパイラオプションの設定。
ToolchainのインクルードパスにFreeRTOSを追加。このとき、All Categoryを選択しておきます(スクショではうっかりDebugのままになっています)。
ターゲットがAtmega328pの場合はこのままコンパイルが通ります。しかしAtmega32u4はシリアルポート0がないので、hooks.cのvApplicationStackOverflowHook()で使っているシリアルポートのシンボルでエラーが出ます。
そこで他の関数に習って、vApplicationStackOverflowHookの下あたりに
#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に繋がっているので出力ポートをそこに指定します。
テストしたメインはこんな感じです。
#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)となっていました。
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)
でおこなっています。
Microcip Studioがいつまで提供されるかわからないので、MPLABのフォルダ周りやデバッガエラーの回避を模索しつつ、今回はこれで進めようと思っております。
本家のソースをとってきて始めたものの、足りない関数のコーディング途中で力尽きてしまいました。先人の知恵に感謝であります。