[KL25Z] Improve division by constant integer in us_ticker implementation.

pull/1/head
Emilio Monti 2013-03-18 17:20:05 +00:00
parent a498bff4a7
commit db129a9c27
4 changed files with 46 additions and 2 deletions

View File

@ -69,7 +69,18 @@ uint32_t us_ticker_read() {
uint64_t ticks;
ticks = (uint64_t)PIT->LTMR64H << 32;
ticks |= (uint64_t)PIT->LTMR64L;
ticks = (~ticks) / 24;
// More efficient division by constant integer (24): /8 /3
// complement (because count down timer) and divide by 8
ticks = (~ticks) >> 3;
// divide by 3
if (ticks > 0xFFFFFFFF) {
ticks /= 3;
} else {
ticks = (ticks * 0x55555556) >> 32;
}
return (uint32_t)(0xFFFFFFFF & ticks);
}

View File

@ -0,0 +1,27 @@
#include "mbed.h"
uint32_t test_64(uint64_t ticks) {
ticks >>= 3; // divide by 8
if (ticks > 0xFFFFFFFF) {
ticks /= 3;
} else {
ticks = (ticks * 0x55555556) >> 32; // divide by 3
}
return (uint32_t)(0xFFFFFFFF & ticks);
}
int main() {
// 0xFFFFFFFF * 8 = 0x7fffffff8
printf("expected : 55555555\n");
printf("64: 0x7fffffff8: %x\n", test_64(0x7fffffff8));
// 0xFFFFFFFF * 24 = 0x17ffffffe8
printf("expected : ffffffff\n");
printf("64: 0x17ffffffe8: %x\n", test_64(0x17FFFFFFE8));
DigitalOut led(LED1);
while (1) {
led = !led;
wait(0.5);
}
}

View File

@ -88,7 +88,7 @@ if __name__ == '__main__':
copy(bin, options.disk)
if options.serial:
if options.mcu in ["M0+", "LPC812"]:
if options.mcu in ["KL25Z", "LPC812"]:
# We do not have a flash disk where to store the image, we write
# it directly on the target chip, therefore we need to
# disconnect the interface: wait for the device to enumerate

View File

@ -296,6 +296,12 @@ TESTS = [
"source_dir": join(TEST_DIR, "mbed", "time_us"),
"dependencies": [MBED_LIBRARIES, TEST_MBED_LIB],
},
{
"id": "MBED_26", "description": "MBED: Integer constant division",
"source_dir": join(TEST_DIR, "mbed", "div"),
"dependencies": [MBED_LIBRARIES, TEST_MBED_LIB],
},
# CMSIS RTOS tests
{
"id": "CMSIS_RTOS_1", "description": "CMSIS RTOS: Basic",