前回までで、機能としては完成したんだが
計時し始めると、どんどん時刻がズレていく問題が見つかった。
最初はオシレータの発振周波数が割り切れない値だったのが
原因かとも思っていたのだけど、原発の周波数が合ってもズレる。
オシロで1秒毎の処理を行っているはずの部分の
時間をチェックしたら…なんだこれは。
どうやら、正時(0秒)に始まる解析処理によって
計時間隔が伸びてしまい、1秒が狂ってしまっている様子。
1秒を計時(本当は1mSecだけど)する処理の中に
他の処理を含めないように作りたいのだけど
どうやったもんか良いアイデアが浮かばなかったので
以前から気にしていたrtosへの実装を試そうと思う。
FreeRTOSのAVRへの実装について調べてみたんだが
資料らしい資料がほとんど無い。
http://www.auv.co.za/blog/atmega128freertos
上記の記事で、AVR Studio上でのビルドのしかたが分かった。
配布されているファイルは、依存部を除いて基本的に
手を加える必要は無い。
手を加える必要があるのは以下の3ファイルだ。
●port.c
FreeRTOSの配布物に、atmega323/gccでのサンプルがある。
今使っている石はatmega88pなので、レジスタ名その他が
若干異なるため、port.cの対応が必要になる。
そのままでは割り込みが使えなかったり
タイマのレジスタ名が異なっていたりするので
一見動いているように見えていても、タスク切り替えなど
肝心なOSとしての機能は一切動いてくれない。注意。
●FreeRTOSConfig.h
atmega323はRAMが2kByteだが、atmega88pは半分の1kByteなので
configTOTAL_HEAP_SIZEをいじってやる必要がある。
あとはconfigCPU_CLOCK_HZで与えているクロック周波数を
設定してやる位だろうか。
●portmacro.h (必須ではない)
私はlong longが使いたかったので、portmacro.hに
+ #define portLONGLONG long long
これを追加している。
●main.c (新規追加:名前は何でも良い?)
配布物の中にはタスクの記述を行う部分、main()などは入っていない。
そこは新たにファイルを作って記述していく事になる。
http://www.freertos.org/a00098.html
まずはLチカという事で、上記サイトを参考にタスクを記述してみる。
この例ではタスクは1発だが、RAMの許す限りタスクは追加出来るようだ。
上が0.5秒毎に点滅させるTask1 , 下が0.2秒毎に点滅させるTask2。
タスクスイッチには、約30uSec程度の時間が掛かっているようだが
見た範囲では切替時間は大きくブレるような事は無いみたい。
という事で、ググっただけで全くもって自分で頑張ってないのだけど
後は一通り開発出来そうな所まで持ってくる事が出来た。
後はタスク間通信のしかたの理解、UART通信の実装辺りが
出来てくると楽しくなってくるかな。
Hey, I think your blog might be having browser compatibility issues. When I look at your blog in Chrome, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, awesome blog!
Thank you for checking the blog.
I also recognize the problem that the display collapses with the Internet Explorer you pointed out.
Since IE is a browser whose maintenance has already been completed, please continue to enjoy with chrome.
Thank you.