FunkOS kernelハード依存部
一月ぶりのFunkOSの続きです。
過去に日記↓
http://ameblo.jp/elementor/entry-10303902339.html
http://ameblo.jp/elementor/entry-10301111081.html
今回はハードウェア依存部分になります。
ハードは下記の評価基板を自作して使用します。
前回紹介した回路(http://ameblo.jp/elementor/entry-10301111081.html )少し変更してます↓↓
・リセットの遅延用コンデンサを外した(AVRISP MKIIでリセット遅延があると回路以上と判断される)
・他凡ミス
マイコンはATMEGA644Pを使用するのでFunkOSプロジェクトファイル無いの
\port\AVR_GCC\atmega644ディレクトリ無いが対象となります。
標準のコードはINT0割り込みを使用しますが、今回はPCINT28を使用できるように変更しています。
もとのコードはhttp://sourceforge.net/projects/funkos/files からダウンロードしてご確認ください。
変更後のソースを下記に記載します。
1.kernelswi.c
//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "types.h"
#include "kernelcfg.h"
#include "task.h"
#include <avr\io.h >
#include <avr\interrupt.h >
/* ソフトウェア割り込みはPORTD-4 PCINT28 */
//---------------------------------------------------------------------------
void KernelSWI_Config(void)
{
PORTD &= ~_BV(PD4); // Clear PCINT28
DDRD |= _BV(PD4); // Set PortD, bit 4 (PCINT28) As Output
}
//---------------------------------------------------------------------------
void KernelSWI_Start(void)
{
PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
PCMSK3 |= _BV(PCINT28); // PCINT28を割込み許可
}
//---------------------------------------------------------------------------
void KernelSWI_Stop(void)
{
PCMSK3 &= ~_BV(PCINT28); // PCINT28を割込み禁止
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
}
//---------------------------------------------------------------------------
void KernelSWI_Clear(void)
{
PCIFR |= _BV(PCIF3); // Clear any pending interrupts on PCINT28
}
/* XOR : ^
A B | Y
----+--
0 0 | 0
0 1 | 1 <- ビット反転
1 0 | 1
1 1 | 0 <- ビット反転
*/
//---------------------------------------------------------------------------
void KernelSWI_Trigger(void)
{
if (Task_IsSchedulerEnabled())
{
PORTD ^= _BV(PD4);
}
}
続いてkerneltimerです。標準では1Tick=100msecですがこれを1msecへ変更します。
2.kerneltimer.c
//---------------------------------------------------------------------------
// FunkOS - Copyright (c) 2009, Funkenstein Software, See license.txt for details
//---------------------------------------------------------------------------
#include "mcu.h"
#include "types.h"
#include "kernelcfg.h"
#include <avr\io.h >
#include <avr\interrupt.h >
#define TICK_TIME (1000UL) /* 1/1msec */
/* Timer Settings
CTC動作 WGM13:0 WGM12:1 WGM11:0 WGM10:0
*/
//---------------------------------------------------------------------------
void KernelTimer_Config(void)
{
// CTC Mode Bit
TCCR1A &= ~_BV(WGM10) & ~_BV(WGM11) & ~_BV(WGM13);
TCCR1B |= _BV(WGM12);
// OCR1A = システムクロック / 分周比(シフト量 8=2^3 64=2^6 256=^8 1024=2^10) / 周期(1msec=1000) -1
TCCR1B &= ~_BV(CS12);
TCCR1B |= _BV(CS11) | _BV(CS10); // 64分周
OCR1A = (USHORT)((CPU_CLOCK / TICK_TIME / 64) - 1); // Set the trigger time / 64 prescaler
}
//---------------------------------------------------------------------------
void KernelTimer_Start(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear pending interrupts
TIMSK1 |= _BV(OCIE1A); // Enable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_Stop(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear interrupt flags
TIMSK1 &= ~_BV(OCIE1A); // Disable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_DI(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear interrupt flags
TIMSK1 &= ~_BV(OCIE1A); // Disable interrupt
}
//---------------------------------------------------------------------------
void KernelTimer_EI(void)
{
TIFR1 &= ~_BV(OCF1A); // Clear pending interrupts
TIMSK1 |= _BV(OCIE1A); // Enable interrupt
}
3.taskport.c
もともとはINT0で割り込みが掛かっていたためこれをPCINT28へ変更します。
変更部分だけ記載します。
○変更前
ISR(INT0_vect) __attribute__ ( ( signal, naked ) ); ISR(INT0_vect)
○変更後
ISR(PCINT3_vect) __attribute__ ( ( signal, naked ) ); ISR(PCINT3_vect)
尚、本変更はPCINT3系でタスクディスパッチャが発生するため、他のPCINT3系を同時利用する場合はtaskport.cで他のピンチェンジ割り込みと切り分ける処理を行う必要があります
また独自にMCUの初期化関数を追加します。
4.mcu.c
/*!
@file mcu.c
@brief MCUの初期化などMCU固有の操作を行います
@author Yamazaki
@date 21-Jul-09, new
*/
#include <avr >
#include "types.h"
#include "mcu.h"
/* ■■■ MCUポートセッティング ■■■
回路図より(2009.7.21現在)
No. Name Pin-No. Net name IO Description
1 PA0 40 D0 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
2 PA1 39 D1 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
3 PA2 38 D2 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
4 PA3 37 D3 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
5 PA4 36 D4 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
6 PA5 35 D5 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
7 PA6 34 D6 OUT OUT固定 LCDデータバスに接続(デフォルト値L)
8 PA7 33 D7 OUT/IN BUSY読み込み時IN LCDデータバスに接続(デフォルト値L出力)
9 PB0 1 RS OUT OUT固定 LCDインストラクション制御(デフォルトL)
10 PB1 2 R/W OUT OUT固定 LCD書出し/読込み制御(デフォルトL)
11 PB2 3 E OUT OUT固定 LCDイネーブル制御(デフォルトL)
12 PB3 4 LED1 OUT OUT固定 L:点灯 H:消灯(デフォルトH)
13 PB4 5 No-Net OUT OUT固定 L
14 PB5 6 MOSI OUT OUT固定 L(ISP)
15 PB6 7 MISO OUT OUT固定 L(ISP)
16 PB7 8 SCK OUT OUT固定 L(ISP)
17 PC0 22 No-NET OUT OUT固定 L
18 PC1 23 No-NET OUT OUT固定 L
19 PC2 24 TCK OUT OUT固定 L(JTAG)
20 PC3 25 TMS OUT OUT固定 L(JTAG)
21 PC4 26 TDO OUT OUT固定 L(JTAG)
22 PC5 27 TDI OUT OUT固定 L(JATG)
23 PC6 28 --- --- 32.768kHz水晶接続(OUT/INどちらでも可)
24 PC7 29 --- --- 32.768kHz水晶接続(OUT/INどちらでも可)
25 PD0 14 RXD --- UART
26 PD1 15 TXD --- UART
27 PD2 16 SW1 IN キー1(チャタリングSWフィルタ必要)
28 PD3 17 SW2 IN キー2(チャタリングSWフィルタ必要)
29 PD4 18 --- OUT ソフトウェア割り込みに使用する(PCINT)
30 PD5 19 --- OUT OUT固定 L(未使用)
31 PD6 20 DTR IN FT232RL
32 PD7 21 LED2 OUT OUT固定 L:点灯 H:消灯(デフォルトH)
Regster | 7 6 5 4 | 3 2 1 0 | Hex
--------+---------+---------+-------
DDRA | 1 1 1 1 | 1 1 1 1 | 0xff
PORTA | 0 0 0 0 | 0 0 0 0 | 0x00
DDRB | 1 1 1 1 | 1 1 1 1 | 0xff
PORTB | 0 0 0 0 | 1 0 0 0 | 0x08
DDRC | 0 0 1 1 | 1 1 1 1 | 0x3f
PORTC | 0 0 0 0 | 0 0 0 0 | 0x00
DDRD | 1 0 1 1 | 0 0 0 0 | 0xb0
PORTD | 1 0 0 0 | 0 0 0 0 | 0x80
*/
/*!
@brief MCU初期化関数
@return MCU_RESET_STSTUS
*/
UCHAR Mcu_Init(void)
{
UCHAR Reset = MCUSR & 0x1f; /* WDRF:WDT BORF:BOR EXTRF:External PORF:PowerOnReset */
MCUSR = 0; /* 電源ON後直ちにクリア */
PORTA = 0x00;
DDRA = 0xff;
PORTB = 0x08;
DDRB = 0xff;
PORTC = 0x00;
DDRC = 0x3f;
PORTD = 0x80;
DDRD = 0xb0;
PCICR |= _BV(PCIE3); // PCINT24~31のPC割込み禁止(ソフトウェア割込みPCIN28)
return Reset;
}
5.mcu.h
#ifndef __MCU_H__ #define __MCU_H__ #include "types.h" #define CPU_CLOCK (16000000UL) /* 16MHz */ #define POW_RESET 1 /*!< 電源ONリセット */ #define EXT_RESET 2 /*!< 外部リセット */ #define BOR_RESET 4 /*!< 電圧低下検知リセット */ #define WDT_RESET 8 /*!< ウォッチドッグタイマリセット */ #define JTG_RESET 16 /*!< JTAGリセット */ UCHAR Mcu_Init(void); #endif /* __MCU_H__ */
最近気付いたのですがリポジトリは少しずつ更新されてたみたいで、最新版をチェックアウトして使った方が良いかと思います。
最近はHD44780のドライバとかジョイスティックのドライバとかも含まれています。
またARM_CM3やMSP430にも対応しているようです
http://sourceforge.net/scm/?type=svn&group_id=263037
つづく
