SSブログ

ESP32でマルチタスクを行う為の、とりあえずここまで判った事 by freeRTOS 13タスク目 [ESP32]

現在実用ガイドを読みながら編集中、、、書いて有る事を信用しない様に!
http://www.profdong.com/elc4438_spring2016/USINGTHEFREERTOSREALTIMEKERNEL.pdf

ESP32はRTOSができるらしい、、、

多重割り込み
FreeRTOSConfig.h内で以下の様に定義されている。
/* The priority at which the tick interrupt runs.  This should probably be
   kept at 1. */
#define configKERNEL_INTERRUPT_PRIORITY  1

configKERNEL_INTERRUPT_PRIORITYは、タイムティックを供給している割り込みの優先度。もしconfigMAX_SYSCALL_INTERRUPT_PRIORITYが使われていないのなら、割り込みを使用する全てのAPI関数は、この割り込みの優先度で実行されなければならない。
/* The maximum interrupt priority from which FreeRTOS.org API functions can
   be called.  Only API functions that end in ...FromISR() can be used within
   interrupts. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY  XCHAL_EXCM_LEVEL

XCHAL_EXCM_LEVELはcore_isa.h内に以下の様に定義されている。
#define XCHAL_EXCM_LEVEL  3	/* level masked by PS.EXCM */
	/* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */

※ESP32ではcore_isa.hはプロジェクトの中に複数存在し、どれも3を定義しているが、どのファイルが実際に使われているか解らない。

configMAX_SYSCALL_INTERRUPT_PRIORITYはAPI関数が使用するもっとも高い割り込みの優先度を示す。

※高機能なCPUでは多重割り込みの機能を持つ物が多い。これは割り込み処理自体にも優先度を設定して、より緊急度の高い割り込みは、他の割り込みに実行を邪魔されない為である。
μiTRONでもそうだけれど定義される割り込みには2種類あり、1つはカーネルが管理する割り込み、1つはカーネルが管理しない割り込みとなる。
一般的にカーネルが管理する割り込みでは、割り込みの最後にディスパッチが行われるために割り込みの反応がその分遅れる事が有る。これを許容できないシステムではカーネルが管理しない割り込みを使う事になるが、その場合RTOSが使用する割り込み優先度よりも高い優先度を持つ割り込みを使用する事となる。

ESP32の割り込みレベルを探してみたら、esp_intr_alloc.h内にこんな定義をみつけた。
//Keep the LEVELx values as they are here; they match up with (1<<level)
#define ESP_INTR_FLAG_LEVEL1		(1<<1)	///< Accept a Level 1 interrupt vector (lowest priority)
#define ESP_INTR_FLAG_LEVEL2		(1<<2)	///< Accept a Level 2 interrupt vector
#define ESP_INTR_FLAG_LEVEL3		(1<<3)	///< Accept a Level 3 interrupt vector
#define ESP_INTR_FLAG_LEVEL4		(1<<4)	///< Accept a Level 4 interrupt vector
#define ESP_INTR_FLAG_LEVEL5		(1<<5)	///< Accept a Level 5 interrupt vector
#define ESP_INTR_FLAG_LEVEL6		(1<<6)	///< Accept a Level 6 interrupt vector
#define ESP_INTR_FLAG_NMI			(1<<7)	///< Accept a Level 7 interrupt vector (highest priority)
#define ESP_INTR_FLAG_SHARED		(1<<8)	///< Interrupt can be shared between ISRs
#define ESP_INTR_FLAG_EDGE			(1<<9)	///< Edge-triggered interrupt
#define ESP_INTR_FLAG_IRAM			(1<<10)	///< ISR can be called if cache is disabled
#define ESP_INTR_FLAG_INTRDISABLED	(1<<11)	///< Return with this interrupt disabled

#define ESP_INTR_FLAG_LOWMED	(ESP_INTR_FLAG_LEVEL1|ESP_INTR_FLAG_LEVEL2|ESP_INTR_FLAG_LEVEL3) ///< Low and medium prio interrupts. These can be handled in C.
#define ESP_INTR_FLAG_HIGH		(ESP_INTR_FLAG_LEVEL4|ESP_INTR_FLAG_LEVEL5|ESP_INTR_FLAG_LEVEL6|ESP_INTR_FLAG_NMI) ///< High level interrupts. Need to be handled in assembly.

#define ESP_INTR_FLAG_LEVELMASK	(ESP_INTR_FLAG_LEVEL1|ESP_INTR_FLAG_LEVEL2|ESP_INTR_FLAG_LEVEL3| \
								 ESP_INTR_FLAG_LEVEL4|ESP_INTR_FLAG_LEVEL5|ESP_INTR_FLAG_LEVEL6| \
								 ESP_INTR_FLAG_NMI) ///< Mask for all level flags

この内容なら、一般的に使用される割り込みレベルは1~6までかな?
レベル1~3までの優先度の割り込みはCで書けるが、レベル4~6、NMIはアセンブラで書けよ!とも書いてある。
https://esp-idf.readthedocs.io/en/v2.0/api/system/intr_alloc.html




ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発

  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/23
  • メディア: Kindle版



図解 μITRONによる組込みシステム入門(第2版)

図解 μITRONによる組込みシステム入門(第2版)

  • 作者: 武井 正彦
  • 出版社/メーカー: 森北出版
  • 発売日: 2018/02/17
  • メディア: 単行本(ソフトカバー)



μITRON4.0標準ガイドブック

μITRON4.0標準ガイドブック

  • 作者:
  • 出版社/メーカー: パーソナルメディア
  • 発売日: 2001/11/01
  • メディア: 単行本(ソフトカバー)



リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))

  • 作者: 高田 広章
  • 出版社/メーカー: CQ出版
  • 発売日: 2004/02
  • メディア: 単行本



nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。