Мне нужно понять несколько функций в библиотеке LMIC - PullRequest
0 голосов
/ 10 июля 2019

Я работаю над библиотекой 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, кроме этих функций, которые я не понимаю.

  1. 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. Любая помощь действительно очень ценится и заранее благодарим за ваше время и помощь.

...