From: Keith Packard Date: Sun, 24 Mar 2013 22:14:12 +0000 (-0700) Subject: altos: Call ao_task_init before initializing any drivers X-Git-Tag: 1.2.1~92 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=4551be8b03a795ece94fd303a1f556c63c0a0096 altos: Call ao_task_init before initializing any drivers When using task queues, the sleep queues must be initialized before any invocation of ao_wakeup or the OS will crash. Just make sure ao_task_init is always invoked early in the task process to get that done. Signed-off-by: Keith Packard --- diff --git a/src/avr-demo/ao_demo.c b/src/avr-demo/ao_demo.c index 756dd0d4..e35babb3 100644 --- a/src/avr-demo/ao_demo.c +++ b/src/avr-demo/ao_demo.c @@ -34,6 +34,8 @@ main(void) { ao_clock_init(); + ao_task_init(); + ao_serial_init(); ao_led_init(LEDS_AVAILABLE); diff --git a/src/product/ao_teledongle.c b/src/product/ao_teledongle.c index 25ebe73e..8bfd8b84 100644 --- a/src/product/ao_teledongle.c +++ b/src/product/ao_teledongle.c @@ -26,6 +26,8 @@ main(void) /* Turn on the LED until the system is stable */ ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_RED); + ao_task_init(); + ao_timer_init(); ao_cmd_init(); ao_usb_init(); diff --git a/src/product/ao_telelaunch.c b/src/product/ao_telelaunch.c index b6e4bfc1..dde66090 100644 --- a/src/product/ao_telelaunch.c +++ b/src/product/ao_telelaunch.c @@ -27,6 +27,8 @@ main(void) ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_RED); + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_beep_init(); diff --git a/src/product/ao_telemetrum.c b/src/product/ao_telemetrum.c index ea77f5af..221498d6 100644 --- a/src/product/ao_telemetrum.c +++ b/src/product/ao_telemetrum.c @@ -42,6 +42,8 @@ main(void) while (P1_3 == 0) ; } + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_beep_init(); diff --git a/src/product/ao_telemini.c b/src/product/ao_telemini.c index 21551ee9..a0d8e18a 100644 --- a/src/product/ao_telemini.c +++ b/src/product/ao_telemini.c @@ -46,6 +46,8 @@ main(void) ; } + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_cmd_init(); diff --git a/src/product/ao_telenano.c b/src/product/ao_telenano.c index d91983d0..77750efd 100644 --- a/src/product/ao_telenano.c +++ b/src/product/ao_telenano.c @@ -28,6 +28,8 @@ main(void) ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_RED); + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_cmd_init(); diff --git a/src/product/ao_telepyro.c b/src/product/ao_telepyro.c index 79454fb7..6f09be64 100644 --- a/src/product/ao_telepyro.c +++ b/src/product/ao_telepyro.c @@ -25,6 +25,8 @@ main(void) PORTE |= (1 << 6); DDRE |= (1 << 6); + ao_task_init(); + ao_avr_stdio_init(); ao_timer_init(); ao_cmd_init(); diff --git a/src/product/ao_telescience.c b/src/product/ao_telescience.c index d448d318..2888c266 100644 --- a/src/product/ao_telescience.c +++ b/src/product/ao_telescience.c @@ -28,6 +28,8 @@ main(void) PORTE |= (1 << 6); DDRE |= (1 << 6); + ao_task_init(); + ao_avr_stdio_init(); ao_timer_init(); ao_cmd_init(); diff --git a/src/product/ao_teleterra.c b/src/product/ao_teleterra.c index d696b914..e739ae0b 100644 --- a/src/product/ao_teleterra.c +++ b/src/product/ao_teleterra.c @@ -26,6 +26,8 @@ main(void) /* Turn on the red LED until the system is stable */ ao_led_init(AO_LED_RED|AO_LED_GREEN); ao_led_on(AO_LED_RED); + ao_task_init(); + ao_timer_init(); ao_beep_init(); ao_cmd_init(); diff --git a/src/product/ao_teleterra_0_2.c b/src/product/ao_teleterra_0_2.c index 68f02596..4f7530f7 100644 --- a/src/product/ao_teleterra_0_2.c +++ b/src/product/ao_teleterra_0_2.c @@ -23,6 +23,8 @@ main(void) { ao_clock_init(); + ao_task_init(); + ao_timer_init(); ao_beep_init(); ao_cmd_init(); diff --git a/src/product/ao_test.c b/src/product/ao_test.c index 14c2eb75..273a73b5 100644 --- a/src/product/ao_test.c +++ b/src/product/ao_test.c @@ -102,6 +102,8 @@ main(void) { ao_clock_init(); + ao_task_init(); + // ao_add_task(&blink_0_task, blink_0); // ao_add_task(&blink_1_task, blink_1); // ao_add_task(&wakeup_task, wakeup); diff --git a/src/product/ao_tidongle.c b/src/product/ao_tidongle.c index cba0b122..b1a96bdd 100644 --- a/src/product/ao_tidongle.c +++ b/src/product/ao_tidongle.c @@ -27,6 +27,9 @@ main(void) /* Turn on the LED until the system is stable */ ao_led_init(AO_LED_RED); ao_led_on(AO_LED_RED); + + ao_task_init(); + ao_timer_init(); ao_cmd_init(); ao_usb_init(); diff --git a/src/spiradio-v0.1/ao_spiradio.c b/src/spiradio-v0.1/ao_spiradio.c index d3647cc7..de9ea706 100644 --- a/src/spiradio-v0.1/ao_spiradio.c +++ b/src/spiradio-v0.1/ao_spiradio.c @@ -25,6 +25,8 @@ main(void) ao_led_init(LEDS_AVAILABLE); + ao_task_init(); + ao_serial_init(); ao_timer_init(); ao_cmd_init(); diff --git a/src/stm-demo/ao_demo.c b/src/stm-demo/ao_demo.c index b82cb735..9ee0be03 100644 --- a/src/stm-demo/ao_demo.c +++ b/src/stm-demo/ao_demo.c @@ -183,6 +183,8 @@ main(void) { ao_clock_init(); + ao_task_init(); + ao_serial_init(); ao_timer_init(); ao_dma_init(); diff --git a/src/stm-flash/ao_stm_flash.c b/src/stm-flash/ao_stm_flash.c new file mode 100644 index 00000000..df466d85 --- /dev/null +++ b/src/stm-flash/ao_stm_flash.c @@ -0,0 +1,137 @@ +/* + * Copyright © 2011 Keith Packard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" +#include +#include +#include + +void +ao_panic(uint8_t reason) +{ + for (;;); +} + +void +ao_application(void) +{ + ao_boot_reboot(AO_BOOT_APPLICATION_BASE); +} + +static uint32_t +ao_cmd_hex32(void) +{ + __pdata uint8_t r = ao_cmd_lex_error; + int8_t n; + uint32_t v = 0; + + ao_cmd_white(); + for(;;) { + n = ao_cmd_hexchar(ao_cmd_lex_c); + if (n < 0) + break; + v = (v << 4) | n; + r = ao_cmd_success; + ao_cmd_lex(); + } + if (r != ao_cmd_success) + ao_cmd_status = r; + return v; +} + +void +ao_block_erase(void) +{ + uint32_t addr = ao_cmd_hex32(); + uint32_t *p = (uint32_t *) addr; + + ao_flash_erase_page(p); +} + +void +ao_block_write(void) +{ + uint32_t addr = ao_cmd_hex32(); + uint32_t *p = (uint32_t *) addr; + union { + uint8_t data8[256]; + uint32_t data32[64]; + } u; + uint16_t i; + + if (addr < 0x08002000 || 0x08200000 <= addr) { + puts("Invalid address"); + return; + } + for (i = 0; i < 256; i++) + u.data8[i] = i; + ao_flash_page(p, u.data32); +} + +static void +puthex(uint8_t c) +{ + c &= 0xf; + if (c < 10) + c += '0'; + else + c += 'a' - 10; + putchar (c); +} + +void +ao_block_read(void) +{ + uint32_t addr = ao_cmd_hex32(); + uint8_t *p = (uint8_t *) addr; + uint16_t i; + uint8_t c; + + for (i = 0; i < 256; i++) { + c = *p++; + puthex(c); + puthex(c>>4); + if ((i & 0xf) == 0xf) + putchar('\n'); + } +} + +__code struct ao_cmds ao_flash_cmds[] = { + { ao_application, "a\0Switch to application" }, + { ao_block_erase, "e \0Erase block." }, + { ao_block_write, "W \0Write block. 256 binary bytes follow newline" }, + { ao_block_read, "R \0Read block. Returns 256 bytes" }, + { 0, NULL }, +}; + +int +main(void) +{ + ao_clock_init(); + + ao_task_init(); + + ao_timer_init(); +// ao_dma_init(); + ao_cmd_init(); +// ao_exti_init(); + ao_usb_init(); + + ao_cmd_register(&ao_flash_cmds[0]); + ao_start_scheduler(); + return 0; +} diff --git a/src/teleballoon-v1.1/ao_teleballoon.c b/src/teleballoon-v1.1/ao_teleballoon.c index c8bf7760..867e98ab 100644 --- a/src/teleballoon-v1.1/ao_teleballoon.c +++ b/src/teleballoon-v1.1/ao_teleballoon.c @@ -52,6 +52,8 @@ main(void) while (P1_3 == 0) ; } + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_beep_init(); diff --git a/src/telebt-v1.0/ao_telebt.c b/src/telebt-v1.0/ao_telebt.c index 4a50a9d4..935cde7d 100644 --- a/src/telebt-v1.0/ao_telebt.c +++ b/src/telebt-v1.0/ao_telebt.c @@ -25,6 +25,9 @@ main(void) /* Turn on the LED until the system is stable */ ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_RED); + + ao_task_init(); + ao_timer_init(); ao_cmd_init(); ao_usb_init(); diff --git a/src/telefire-v0.1/ao_telefire.c b/src/telefire-v0.1/ao_telefire.c index cc0f668f..afa09e20 100644 --- a/src/telefire-v0.1/ao_telefire.c +++ b/src/telefire-v0.1/ao_telefire.c @@ -27,6 +27,8 @@ main(void) ao_led_init(LEDS_AVAILABLE); + ao_task_init(); + ao_timer_init(); ao_adc_init(); ao_beep_init(); diff --git a/src/telelco-v0.1/ao_telelco.c b/src/telelco-v0.1/ao_telelco.c index 080a140b..70665ec6 100644 --- a/src/telelco-v0.1/ao_telelco.c +++ b/src/telelco-v0.1/ao_telelco.c @@ -36,6 +36,8 @@ main(void) ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_GREEN); + ao_task_init(); + ao_timer_init(); ao_spi_init(); diff --git a/src/telescience-v0.2/ao_telescience.c b/src/telescience-v0.2/ao_telescience.c index 2fb3186a..74eef8f4 100644 --- a/src/telescience-v0.2/ao_telescience.c +++ b/src/telescience-v0.2/ao_telescience.c @@ -29,9 +29,11 @@ main(void) ao_mpu_init(); #endif - ao_task_init(); ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_GREEN); + + ao_task_init(); + ao_timer_init(); ao_spi_init(); diff --git a/src/teleshield-v0.1/ao_teleshield.c b/src/teleshield-v0.1/ao_teleshield.c index 4c32817a..d602f646 100644 --- a/src/teleshield-v0.1/ao_teleshield.c +++ b/src/teleshield-v0.1/ao_teleshield.c @@ -29,6 +29,7 @@ main(void) /* Turn on the LED until the system is stable */ ao_led_init(LEDS_AVAILABLE); ao_led_on(AO_LED_RED); + ao_task_init(); ao_timer_init(); ao_cmd_init(); ao_spi_init();