お世話になります。TNと申します。
ご教授お願いします。
【問い合わせ内容】
RAマイコン、RTOS、e2studioを使用し、AGTタイマー割り込み(void i_agt_int_user(void))からタスクのサスペンドを解除
したいのですが、以下のコードでは解除されません。
コード生成(タスクやハードの設定)はFSP configrationの機能を使用し、 i_agt_int_user(void)はintrrupts configrationで設定しています。
設定方法に問題があるのか、APIの使用方法に問題があるのかわかりません。
割り込みからのサスペンド解除を行う設定と、方法をお教え願いないでしょうか
よろしくお願いします。
extern TaskHandle_t new_thread0;
// タスク処理
void new_thread0_entry(void *pvParameters){ FSP_PARAMETER_NOT_USED (pvParameters);
volatile int debug;
R_AGT_Open(&g_timer0_ctrl, &g_timer0_cfg); R_AGT_Start(&g_timer0_ctrl);
/* TODO: add your own code here */ while (1) { vTaskSuspend(NULL); debug=0;
}}
// 割り込み処理
void i_agt_int_user(void){ BaseType_t ret = pdFALSE;
ret = xTaskResumeFromISR(new_thread0);
portYIELD_FROM_ISR(pdTRUE);}
TNさん、こんにちは。NoMaYと申します。FreeRTOSですので、私の場合ですと、xTaskResumeFromISR(new_thread0)の中へステップ実行して行って、何かがASSERT/assertにより検出されていないか調べてみます。他にズバリのリプライが無かったら、そうされてみてはどうでしょうか?また、とっさに気になったことですが、割り込みの優先順位がFreeRTOSの割り込み処理が動作する範囲外(RXマイコンならconfigMAX_SYSCALL_INTERRUPT_PRIORITY以上、すみませんがARMマイコンは以上なのか以下なのか不明で分からないです、、、割り込みの優先順位が非直感的との話題を見た記憶があります、、、)だったりしませんでしょうか。
TNさん、こんにちは。NoMaYです。ちなみに、ヘッダファイルに以下の記載がありましたので、このAPIは充分に注意して使う必要があるようです。
/** * task. h * <pre> * void xTaskResumeFromISR( TaskHandle_t xTaskToResume ); * </pre> * * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be * available. See the configuration section for more information. * * An implementation of vTaskResume() that can be called from within an ISR. * * A task that has been suspended by one or more calls to vTaskSuspend () * will be made available for running again by a single call to * xTaskResumeFromISR (). * * xTaskResumeFromISR() should not be used to synchronise a task with an * interrupt if there is a chance that the interrupt could arrive prior to the * task being suspended - as this can lead to interrupts being missed. Use of a * semaphore as a synchronisation mechanism would avoid this eventuality. * * @param xTaskToResume Handle to the task being readied. * * @return pdTRUE if resuming the task should result in a context switch, * otherwise pdFALSE. This is used by the ISR to determine if a context switch * may be required following the ISR. * * \defgroup vTaskResumeFromISR vTaskResumeFromISR * \ingroup TaskCtrl */BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
TNさん、こんにちは。NoMaYです。私のFSP(とRA)の知識は、以下のGitHubにFSPのソースがあること(とARMコアのほんの入り口)までなのですが、xTaskResumeFromISR(new_thread0)の中へステップ実行して行ってみるという話以前として、以下の2点に関してはどうなのかな、という考えが思い浮かびました。github.com/renesas/fsp(1) そもそも割り込みに来ている?極端な例では、他マイコンの事例として、main()の先頭でEI()を呼ばなければいけなかった、等あったりします、、、これは割り込みルーチン(or コールバックルーチンと呼んだ方が適切なのかは分からないですが)先頭にブレークポイントを設定して、Goさせてみれば、状況は把握出来ると思います。ブレークしないようならば、まず、割り込みルーチンを使えるようにする為のサンプルコードを探す必要があると思うのです。(2) FreeRTOSを使うお膳立ては出来ている?FSPのソースの場所は知っていても中まで見てはいないので、正しいかどうか分からないですが、デフォルトでFreeRTOSが使えるようになっているものなのか気になります。たぶんxTaskResumeFromISR()でリンクエラーを起こしている訳では無さそうなので、FreeRTOSのコンポーネントは追加されていると思いますが、FreeRTOSが必要とするTick割り込みとYield割り込みが自動的に有効化されているのか、手動で何かしないといけないのか、気になります。このあたりは、タスクをひとつ作って、vTaskDelay( pdMS_TO_TICKS(1000) )だけのループを記述して、1秒毎にブレークするかどうか調べてみれば、状況は把握出来ると思います。もしそうならないようであれば、FreeRTOSを使うお膳立てが出来ていない可能性が高い、と思うのです。と、ここまで書いて、GitHubを見たところ、以下のリポジトリとサンプルコードらしきものがありました。これは、どうでしょうか?取っ掛かりになりませんでしょうか?github.com/renesas/ra-fsp-examplesgithub.com/renesas/ra-fsp-examples/tree/master/example_projects/ek_ra6m3/freertos/freertos_ek_ra6m3_ep