こんにちは
SIUL出力として設定されたピンを使用して機能時間を測定しようとしていますが、ピンのHIGHとLOWを実行するには1.8usから2.2us(オシロスコープを使用して測定)かかることがわかります。RTD ドライバーで定義されている関数 Siul2_Dio_Ip_WritePin を使用しています。MCUは160MHzで動作するS32K311で、SIULペリフェラルは30MHzで動作します。
データシートでは、ピンの立ち上がり/立ち下がり時間(hw)が1〜18nsであると指定されているため、残りの時間はRTDドライバーによって消費される必要があり、分解を確認すると、この機能にあまり時間が必要ないとは思われません。何かが足りないのでしょうか?なぜMCUはWrite pinコマンドを実行するために~2usが必要なのですか?
さて、Siul2_Dio_Ip_WritePin機能のLOCK / UNLOCKセクションを削除しましたが、現在は265nsかかります。
おっしゃるように、各命令が5サイクルかかり、REGISTER SETセクションに10の命令が必要な場合、それは400nsでなければならず、これは測定された265nsとほぼ一致します。
サポートしてくれてありがとう!
次のコードを想定します。
while(1) {
Siul2_Dio_Ip_WritePin(DEBUG_1_PORT, DEBUG_1_PIN, 0);
Siul2_Dio_Ip_WritePin(DEBUG_1_PORT, DEBUG_1_PIN, 1);
}Siul RTD ドライバーに足を踏み入れると、次のようになります。
void Siul2_Dio_Ip_WritePin(... args ...) {
...
empty asserts
...
/* LOCK code */
SchM_Enter_Dio_DIO_EXCLUSIVE_AREA_01();
/* End LOCK code
/* REGISTER SET code
Siul2_Dio_Ip_PinsChannelType pinsValues = (Siul2_Dio_Ip_PinsChannelType)base->PGPDO;
pinsValues &= (Siul2_Dio_Ip_PinsChannelType)(~((Siul2_Dio_Ip_PinsChannelType)1U << (15U - pin)));
pinsValues |= (Siul2_Dio_Ip_PinsChannelType)(((Siul2_Dio_Ip_PinsChannelType)value & 1U) << (15U - pin));
base->PGPDO = pinsValues;
/* End REGISTER SET code
/* UNLOCK code */
SchM_Exit_Dio_DIO_EXCLUSIVE_AREA_01();
/* End UNLOCK code */
}REGISTER SET中に行われた操作をリストすると、LOCK + REGISTER SET + UNLOCKの3つのセクションに分割します。
Cortex M7(S32K311)を使用すると、120MHzのコアクロック== 83nsで、1回の操作で1サイクルあたり約10サイクルかかると仮定しています(間違っている場合は訂正してください)。
ですから、私が見る2usの時間のほとんどは、LOCK / UNLOCKセクションから来ていると思います。
コードが上記のように単純であると仮定して、RTDからLOCK / UNLOCKセクションを削除できますか?