Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Задача: сделать так, чтобы loop отрабатывал 100.000мкс при отработке кода в нем за меньшее время - с максимально возможной точностью. У данного кода теоретическая точность - 4мкс.
volatile unsigned long ulMCS_Begin = micros(); //Далее код длительностью 93мс. volatile unsigned long ulMCS_End = micros(); volatile unsigned long iSign = 1; if (ulMCS_Begin > ulMCS_End) { ulMCS_Begin = 4294967295 - ulMCS_Begin + 1; iSign = -1; } volatile const unsigned long ulMCS_Needed = iSign*ulMCS_Begin + g_fPeriod_Loop_MCS; //g_fPeriod_Loop_MCS = константа 100.000мкс. volatile const float fMCS_Delay = g_fPeriod_Loop_MCS - (ulMCS_End - iSign*ulMCS_Begin); //Необходимая задержка в мкс. Теперь ее нужно грамотно реализовать. if (fMCS_Delay < 0) vError(10, String(g_fPeriod_Loop_MCS - fMCS_Delay, 0)); if (fMCS_Delay < 1) vError(15, String(g_fPeriod_Loop_MCS - fMCS_Delay, 0)); while (ulMCS_Needed > ulMCS_End) ulMCS_End = micros(); if (ulMCS_End-iSign*ulMCS_Begin < g_fPeriod_Loop_MCS-108 || ulMCS_End-iSign*ulMCS_Begin > g_fPeriod_Loop_MCS+108) vError(16, String(float(ulMCS_Needed), 0)); При переполнении micros (переходе 4294967295 в 0) - почему-то данный код не срабатывает, считая, что ulMCS_Needed = 0. Не могу найти, в чем логический косяк. |