読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

軽量 RTOS の開発 (6)

OS ARM C

今日はあまり進捗がなかったです…。というのも、カーネルとユーザタスクが一緒くたになっていたので、インタフェースを整えるべく、のほほんとリファクタリングしてたのですが、あるところで修正前後の挙動が保存されなくなってしまい、そのバグ取りではまっていたからです。

原因を追ってみたところ、最初のタスクがディスパッチされる直後で、現在実行中のタスク構造体の内容が書き変わるという。この時点で何かに気がつけば良かったのですが、タスクのディスパッチに使っている例外復帰のコードに原因があると思ってしまい、あらぬ方向で格闘してしまいました。

このバグの結論としては、タスクのスタック領域が少なすぎてオーバーフローしてしまい、その先にあるカーネルのデータ領域を破壊していた模様です。万策尽き果てた末、何となくスタック領域を多めに変えてみたら正常な動作に復帰したという、なんともラッキーなオチでした。

スタック領域は通常、高位アドレス側から低位アドレスに向かって成長するようにしているため、たとえオーバーフローしてもカーネル領域まではすぐには到達しないだろう、と思っていたのですが、これはデフォルトタスク用のスタックなので静的に確保するようにリファクタリング開始直後に変更したもので、カーネルの他のデータと同居していたのでした・・・はぁ。