FreeRTOS(坑(1)
記事のディレクトリ
1.問題
1.1原則スキーム
STM32F04
一連の増加FreeRTOS
リアルタイムシステム、でバイナリセマフォ関数を作成USART2
し、データを送信するMCU
、MCU
ことにより、DMA
データを受信DMA
割り込みサービスルーチン内で使用するFreeRTOS API
機能、そしてUSART1
結果アウトシステムをプリント。
ここで
USART1
リダイレクトを行います。
2.エラー結果
- システムによって報告されるエラーメッセージ
Error: ...\FreeRTOS\portable\RVDS\ARM_CM4F\port.c, 768
は、このパスの768行です。
3.解決策
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel = DMA1_Stream5_IRQn;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStr.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStr.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStr);
- 割り込み優先順位の変更よりも大きいセットでのマクロ定義。
UART2
DMA
FreeRTOSConfig.h
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel = DMA1_Stream5_IRQn;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStr.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStr.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStr);
変更、再コンパイル、書き込みを行った後、エラーが報告されないことがわかります。
4.原則の問題
上図のエラー結果に示すように、この機能に問題がある場合は、現在の優先度がシステムの最大優先度を上回っているため、エラーと判断される可能性があります。
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
これからport.c
コメントをどこで学ぶことができるかを追跡できるかInterrupt priority
どうかは質問です:
言い換えるとFreeRTOSConfig.h
、FreeRTOS
関連する割り込み設定オプションでは、次のことをある程度理解しています。
/* 根据 MCU 架构设置 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
/* 此用于设置 FreeRTOS 系统可管理的最大优先级 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* 内核中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
4.1NVIC割り込みコントローラー
ではFreeRTOSConfig.h
、以前の構成、我々が何をしたいの面で、優先度の割り込みプロセッサは、これは非常に重要な、とだけ明確に理解した後、私たちはそのように構成行かなければならない理由を理解するためです。STM32
Cortex-M
ここでのプロセッサ、例えば、それが持っているあるビット優先順位、優先順位番号。STM32F407
Cortex-M4
4
16
これはシステム16
の使用における優先順位でありFreeRTOS
、すべてプリエンプション優先順位に設定されています。それでは、どのように設定しますか?これは、次の関数を呼び出すことで実現できます。では、なぜ4
それをつかむために設定されたすべての優先順位の優先順位を置く必要があるのでしょうか?私たちは主にFreeRTOS
システムを使用し、構成プロセスのサブ優先度の場合を中断しません。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
この関数はメイン関数の最初の行に配置されており、RTOSシステムは最初から通知する必要があります。
優先度はどのように設定されますか?
まず、16
優先度番号があり、優先度2
と優先度5
を比較しますが、優先2
度は比較的高いです。彼n
は、私たちがデジタルレベルと呼ぶものの優先度レベル、次に私たちが論理レベルと呼ぶ結果を述べました。これは明確でなければなりません。以下の説明はすべて論理レベルで説明されています。
4.2FreeRTOS割り込みレベルの構成
/* 根据 MCU 架构设置 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
このマクロ定義はMCU
、優先度レベルSTM32
しかないため、最小優先度のフレームワークを設定するために使用され16
ます。そのため15
、0 ~ 15
優先度番号を設定します。
/* 此用于设置 FreeRTOS 系统可管理的最大优先级数 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
このマクロ定義はFreeRTOS
、最大優先順位番号を管理するようにシステムを設定するために使用され16
ます。マクロ定義から、レベルの優先順位があることがわかります。これは、システム管理者0 ~ 4
が所有しFreeRTOS
、5〜15人のユーザーが管理していると簡単に理解できます。これは、確認された権利に違いがあることを示しています。違いは何ですか?
FreeRTOS API関数は、「FromISR」で終わるAPIの関数です。
/* 内核中断优先级 */
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
この最後のFreeRTOSConfig.h
構成は、実際、理解しやすいので、優れたコアアーキテクチャを設定しFreeRTOS
、最大優先順位番号をシフトし、ユーザーが利用できる位置に優先順位をシフトすることができました。これはBit4 ~ Bit7
ビットです。
まとめ:したがって、サービス機能を中断する時間を使用するたびにNVIC
、割り込み番号である割り込みコントローラーを設定する必要があります。この割り込み番号をユーザー管理またはシステム管理の位置に設定する場合は、実際の状況に応じて設定する必要があります。システム管理の位置を設定し、1つのことを覚えて、FreeRTOS API
提供された機能を使用してそれらを絶対に中断しない場合、それは”FromISR“
終わりです。