Skip to content

Commit

Permalink
add: documentation - "how the "run" function works"
Browse files Browse the repository at this point in the history
  • Loading branch information
heX16 committed Apr 22, 2020
1 parent 3d53e48 commit e878bd9
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,18 @@ Attention: only for professionals! Additional testing required.
These timers take into account ["millis overflow"](https://forum.arduino.cc/index.php?topic=68349.0) ([millis rollover](https://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/) ) and process it correctly.

Using **csTimerDef** does not increase the size of the timer. **csTimer** and **csTimerDef** are indeed the same size. This is due to the fact that the default time is stored in code (FLASH) and not in RAM (SRAM).

# Technical details - how the "run" function works

`if (((TTimer) ((TTimer) (TIMER_GET_TIME / PrecDiv) - timer) & BitMask) <MaxValue) {...`

How it works?

Cleared entry: `if ((TIMER_GET_TIME - timer) <MaxValue) {...`

In a normal situation, the number becomes negative (if the timer has not yet reached the activation time). But an unsigned integer is used here, so overflow occurs. Overflow gives a large number. "Overflow numbers" are considered to be all that exceed half the possible range (this is similar to "signed int" at the binary level). To determine the overcrowded number, the constant "MaxValue" is used.

As soon as the number becomes less than “overflowed”, this means that the number is no longer negative, and this means that the timer has reached activation time.

Why am I not using regular numbers? - because in this project binary operations and bit masks are actively used, I need to completely control the binary system.

15 changes: 15 additions & 0 deletions README_RUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,19 @@ void loop() {

Использование **csTimerDef** не увеличивает размер таймера. **csTimer** и **csTimerDef** действительно имеют одинаковый размер. Это осуществляется благодаря тому что время по умолчанию хранится в коде а не в оперативной памяти.

# Технические подробности - как работает функция "run"

`if ( ((TTimer)((TTimer)(TIMER_GET_TIME / PrecDiv) - timer) & BitMask) < MaxValue) { ...`

Как это работает?

Очищеная запись: `if ((TIMER_GET_TIME - timer) < MaxValue) { ...`

В нормальной ситуации число становится отрицательным (если таймер еще не достиг времени активации). Но здесь используется беззнаковое целое, поэтому происходит переполнение. Переполнение дает большое число. "Переполненными числами" считаются все которые превышают половину возможного диапазона (это аналогично "signed int" на бинарном уровне). Для определения переполненного числа используется константа "MaxValue".

Как только число стало меньше "переполненного" это значит что число больше не отрицательное, и это значит что таймер достиг времени активации.

Почему я не использую обычные числа? - потомучто в этом проекте активно используются бинарные операции и битовые маски, мне нужно полностью контролировать бинарную систему.



5 changes: 3 additions & 2 deletions src/small_timer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Repository: https://github.com/heX16/small_timer

// timer template
template <
typename TTimer, // type Timer
typename TTimer, // type Timer (must be unsigned)
unsigned long MaxValue, // max time in Timer
unsigned long BitMask, // mask of value
unsigned int DisableBit, // timer disable bit number
Expand Down Expand Up @@ -95,6 +95,7 @@ class tpTimer {
if ( ! enabled())
return false;
//TTimer temp = ((TTimer)((TTimer)TIMER_GET_TIME - timer) & 0x7FFF);
// see: README.md # Technical details - how the "run" function works
if ( ((TTimer)((TTimer)(TIMER_GET_TIME / PrecDiv) - timer) & BitMask) < MaxValue) {
stop();
return true;
Expand Down Expand Up @@ -129,7 +130,7 @@ class tpTimer {
//// //// //// //// //// //// //// //// //// //// //// //// //// //// //// ////

template <
typename TTimer, // type Timer
typename TTimer, // type Timer (must be unsigned)
unsigned long MaxValue, // max time in Timer
unsigned long BitMask, // mask of value
unsigned int DisableBit, // timer disable bit number
Expand Down

0 comments on commit e878bd9

Please sign in to comment.