FreeRTOS(坑(1)

FreeRTOS(坑(1)

転載は出典を示しています!

1.問題

1.1原則スキーム

STM32F04一連の増加FreeRTOSリアルタイムシステム、でバイナリセマフォ関数を作成USART2し、データを送信するMCUMCUことにより、DMAデータを受信DMA割り込みサービスルーチン内で使用するFreeRTOS API機能、そしてUSART1結果アウトシステムをプリント。

ここでUSART1リダイレクトを行います。

2.エラー結果

  1. システムによって報告されるエラーメッセージError: ...\FreeRTOS\portable\RVDS\ARM_CM4F\port.c, 768は、このパスの768行です。

画像-20210225175315917

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);
  1. 割り込み優先順位の変更よりも大きいセットでのマクロ定義UART2DMAFreeRTOSConfig.hconfigLIBRARY_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どうか質問です:

画像-20210225180238365

言い換えるとFreeRTOSConfig.hFreeRTOS関連する割り込み設定オプションでは、次のことをある程度理解しています。

/* 根据 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、以前の構成、我々が何をしたいの面で、優先度の割り込みプロセッサは、これは非常に重要な、とだけ明確に理解した後、私たちはそのように構成行かなければならない理由を理解するためです。STM32Cortex-M

ここでのプロセッサ、例えば、それが持っているあるビット優先順位、優先順位番号。STM32F407Cortex-M4416

入札の組織仕様

これはシステム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ます。そのため150 ~ 15優先度番号を設定します。

/* 此用于设置 FreeRTOS 系统可管理的最大优先级数 */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5

このマクロ定義はFreeRTOS、最大優先順位番号を管理するようにシステムを設定するために使用され16ます。マクロ定義から、レベルの優先順位があることがわかります。これは、システム管理者0 ~ 4が所有しFreeRTOS、5〜15人のユーザーが管理していると簡単に理解できます。これは、確認された権利に違いがあることを示しています。違いは何ですか?

入札業務の組織化基準(3)

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“終わりです。

おすすめ

転載: blog.csdn.net/qq_43125185/article/details/114100444