Я работаю над библиотекой Lora для платы Renesas synergy s7 и пытаюсь взять ссылки из библиотеки LMIC и изменить ее в соответствии с платой. Функции, по которым мне нужна помощь:
1. u4_t hal_ticks ()
2. void hal_waitUntil (время u4_t)
3. void hal_disableIRQs ()
4. void hal_enableIRQs ()
Почему эти функции необходимы для работы Lora? что именно делают эти функции и как я могу изменить их, чтобы они соответствовали плате Renesas synergy s7.
Я смог работать с другими функциями из файла hal.cpp, поэтому теперь я могу записывать в регистры микросхем Lora через интерфейс SPI, кроме этих функций, которые я не понимаю.
u4_t hal_ticks () {
>// Because micros() is scaled down in this function, micros() will
>// overflow before the tick timer should, causing the tick timer to
>// miss a significant part of its values if not corrected. To fix
>// this, the "overflow" serves as an overflow area for the micros()
>// counter. It consists of three parts:
>// - The US_PER_OSTICK upper bits are effectively an extension for
>// the micros() counter and are added to the result of this
>// function.
>// - The next bit overlaps with the most significant bit of
>// micros(). This is used to detect micros() overflows.
>// - The remaining bits are always zero.
>//
>// By comparing the overlapping bit with the corresponding bit in
>// the micros() return value, overflows can be detected and the
>// upper bits are incremented. This is done using some clever
>// bitwise operations, to remove the need for comparisons and a
>// jumps, which should result in efficient code. By avoiding shifts
>// other than by multiples of 8 as much as possible, this is also
>// efficient on AVR (which only has 1-bit shifts).
static uint8_t overflow = 0;
>// Scaled down timestamp. The top US_PER_OSTICK_EXPONENT bits are 0,
>// the others will be the lower bits of our return value.
uint32_t scaled = micros() >> US_PER_OSTICK_EXPONENT;
>// Most significant byte of scaled
uint8_t msb = scaled >> 24;
>// Mask pointing to the overlapping bit in msb and overflow.
const uint8_t mask = (1 << (7 - US_PER_OSTICK_EXPONENT));
>// Update overflow. If the overlapping bit is different
>// between overflow and msb, it is added to the stored value,
>// so the overlapping bit becomes equal again and, if it changed
>// from 1 to 0, the upper bits are incremented.
overflow += (msb ^ overflow) & mask;
>// Return the scaled value with the upper bits of stored added. The
>// overlapping bit will be equal and the lower bits will be 0, so
>// bitwise or is a no-op for them.
return scaled | ((uint32_t)overflow << 24);
>// 0 leads to correct, but overly complex code (it could just return
>// micros() unmodified), 8 leaves no room for the overlapping bit.
static_assert(US_PER_OSTICK_EXPONENT > 0 && US_PER_OSTICK_EXPONENT < 8, "Invalid US_PER_OSTICK_EXPONENT value");
}
void hal_waitUntil (u4_t time) {
s4_t delta = delta_time(time);
>// From delayMicroseconds docs: Currently, the largest value that
>// will produce an accurate delay is 16383.
while (delta > (16000 / US_PER_OSTICK)) {
delay(16);
delta -= (16000 / US_PER_OSTICK);
}
if (delta > 0)
delayMicroseconds(delta * US_PER_OSTICK);
}
3.
void hal_disableIRQs () {
noInterrupts();
irqlevel++;
}
4
void hal_enableIRQs () {
if(--irqlevel == 0) {
interrupts();
>// Instead of using proper interrupts (which are a bit tricky
>// and/or not available on all pins on AVR), just poll the pin
>// values. Since os_runloop disables and re-enables interrupts,
>// putting this here makes sure we check at least once every
>// loop.
>//
>// As an additional bonus, this prevents the can of worms that
>// we would otherwise get for running SPI transfers inside ISRs
hal_io_check();
}
}
код, который вы также можете увидеть на GitHub https://github.com/matthijskooijman/arduino-lmic/blob/master/src/hal/hal.cpp
Конечным результатом будет связанный узел в сети вещей, использующий Renesas synergy s7 и щит Dragino Lora. Любая помощь действительно очень ценится и заранее благодарим за ваше время и помощь.