From 43b31efb76d16dd7f23eef31926823bcaee75277 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 31 Aug 2011 22:35:03 -0400 Subject: [PATCH] pios: allocate driver instance data from heap Allocate per-instance data for drivers from the heap rather than as static variables from the .data segment. This converts > 800 bytes of RAM from being always consumed as static data into being allocated from the heap only when a particular feature is enabled in the hwsettings object. A minimal config (no receivers, flexi port disabled, main port disabled) leaves 2448 bytes of free heap. That's our new baseline. Approximate RAM (heap) costs of enabling various features: + 632 Serial Telemetry (includes 400 bytes of Rx/Tx buffers) + 108 PWM Rcvr + 152 PPM Rcvr + 112 Spektrum Rcvr + 24 S.Bus (Should be closer to 68 since driver is still using static memory) There are still some drivers that pre-allocate all of their memory as static data. It'll take some work to convert those over to dynamically allocating their instance data. --- flight/PiOS/Common/pios_com.c | 4 ++-- flight/PiOS/Common/pios_rcvr.c | 4 ++-- flight/PiOS/STM32F10x/pios_i2c.c | 8 ++++---- flight/PiOS/STM32F10x/pios_ppm.c | 4 ++-- flight/PiOS/STM32F10x/pios_pwm.c | 4 ++-- flight/PiOS/STM32F10x/pios_spektrum.c | 4 ++-- flight/PiOS/STM32F10x/pios_spi.c | 4 ++-- flight/PiOS/STM32F10x/pios_usart.c | 4 ++-- flight/PiOS/STM32F10x/pios_usb_hid.c | 4 ++-- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index b7a9a67e5..e7fba8867 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -67,12 +67,12 @@ static bool PIOS_COM_validate(struct pios_com_dev * com_dev) return (com_dev && (com_dev->magic == PIOS_COM_DEV_MAGIC)); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_com_dev * PIOS_COM_alloc(void) { struct pios_com_dev * com_dev; - com_dev = (struct pios_com_dev *)malloc(sizeof(*com_dev)); + com_dev = (struct pios_com_dev *)pvPortMalloc(sizeof(*com_dev)); if (!com_dev) return (NULL); com_dev->magic = PIOS_COM_DEV_MAGIC; diff --git a/flight/PiOS/Common/pios_rcvr.c b/flight/PiOS/Common/pios_rcvr.c index 29acb2594..43275ba6b 100644 --- a/flight/PiOS/Common/pios_rcvr.c +++ b/flight/PiOS/Common/pios_rcvr.c @@ -20,12 +20,12 @@ static bool PIOS_RCVR_validate(struct pios_rcvr_dev * rcvr_dev) return (rcvr_dev->magic == PIOS_RCVR_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_rcvr_dev * PIOS_RCVR_alloc(void) { struct pios_rcvr_dev * rcvr_dev; - rcvr_dev = (struct pios_rcvr_dev *)malloc(sizeof(*rcvr_dev)); + rcvr_dev = (struct pios_rcvr_dev *)pvPortMalloc(sizeof(*rcvr_dev)); if (!rcvr_dev) return (NULL); rcvr_dev->magic = PIOS_RCVR_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_i2c.c b/flight/PiOS/STM32F10x/pios_i2c.c index 0d47fd117..6e623d597 100644 --- a/flight/PiOS/STM32F10x/pios_i2c.c +++ b/flight/PiOS/STM32F10x/pios_i2c.c @@ -823,12 +823,12 @@ static bool PIOS_I2C_validate(struct pios_i2c_adapter * i2c_adapter) return (i2c_adapter->magic == PIOS_I2C_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 -static struct pios_i2c_dev * PIOS_I2C_alloc(void) +#if defined(PIOS_INCLUDE_FREERTOS) +static struct pios_i2c_adapter * PIOS_I2C_alloc(void) { - struct pios_i2c_dev * i2c_adapter; + struct pios_i2c_adapter * i2c_adapter; - i2c_adapter = (struct pios_i2c_adapter *)malloc(sizeof(*i2c_adapter)); + i2c_adapter = (struct pios_i2c_adapter *)pvPortMalloc(sizeof(*i2c_adapter)); if (!i2c_adapter) return(NULL); i2c_adapter->magic = PIOS_I2C_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_ppm.c b/flight/PiOS/STM32F10x/pios_ppm.c index 0b7a1c5cd..d3ebeebf3 100644 --- a/flight/PiOS/STM32F10x/pios_ppm.c +++ b/flight/PiOS/STM32F10x/pios_ppm.c @@ -83,12 +83,12 @@ static bool PIOS_PPM_validate(struct pios_ppm_dev * ppm_dev) return (ppm_dev->magic == PIOS_PPM_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_ppm_dev * PIOS_PPM_alloc(void) { struct pios_ppm_dev * ppm_dev; - ppm_dev = (struct pios_ppm_dev *)malloc(sizeof(*ppm_dev)); + ppm_dev = (struct pios_ppm_dev *)pvPortMalloc(sizeof(*ppm_dev)); if (!ppm_dev) return(NULL); ppm_dev->magic = PIOS_PPM_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_pwm.c b/flight/PiOS/STM32F10x/pios_pwm.c index 9717f66fc..a1276c88c 100644 --- a/flight/PiOS/STM32F10x/pios_pwm.c +++ b/flight/PiOS/STM32F10x/pios_pwm.c @@ -63,12 +63,12 @@ static bool PIOS_PWM_validate(struct pios_pwm_dev * pwm_dev) return (pwm_dev->magic == PIOS_PWM_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_pwm_dev * PIOS_PWM_alloc(void) { struct pios_pwm_dev * pwm_dev; - pwm_dev = (struct pios_pwm_dev *)malloc(sizeof(*pwm_dev)); + pwm_dev = (struct pios_pwm_dev *)pvPortMalloc(sizeof(*pwm_dev)); if (!pwm_dev) return(NULL); pwm_dev->magic = PIOS_PWM_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_spektrum.c b/flight/PiOS/STM32F10x/pios_spektrum.c index dab724ef8..f0a611671 100644 --- a/flight/PiOS/STM32F10x/pios_spektrum.c +++ b/flight/PiOS/STM32F10x/pios_spektrum.c @@ -82,12 +82,12 @@ static bool PIOS_SPEKTRUM_validate(struct pios_spektrum_dev * spektrum_dev) return (spektrum_dev->magic == PIOS_SPEKTRUM_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_spektrum_dev * PIOS_SPEKTRUM_alloc(void) { struct pios_spektrum_dev * spektrum_dev; - spektrum_dev = (struct pios_spektrum_dev *)malloc(sizeof(*spektrum_dev)); + spektrum_dev = (struct pios_spektrum_dev *)pvPortMalloc(sizeof(*spektrum_dev)); if (!spektrum_dev) return(NULL); spektrum_dev->magic = PIOS_SPEKTRUM_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_spi.c b/flight/PiOS/STM32F10x/pios_spi.c index 74a14afc0..a5e57335f 100644 --- a/flight/PiOS/STM32F10x/pios_spi.c +++ b/flight/PiOS/STM32F10x/pios_spi.c @@ -46,10 +46,10 @@ static bool PIOS_SPI_validate(struct pios_spi_dev * com_dev) return(true); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_spi_dev * PIOS_SPI_alloc(void) { - return (malloc(sizeof(struct pios_spi_dev))); + return (pvPortMalloc(sizeof(struct pios_spi_dev))); } #else static struct pios_spi_dev pios_spi_devs[PIOS_SPI_MAX_DEVS]; diff --git a/flight/PiOS/STM32F10x/pios_usart.c b/flight/PiOS/STM32F10x/pios_usart.c index 8582344b5..68a9265ee 100644 --- a/flight/PiOS/STM32F10x/pios_usart.c +++ b/flight/PiOS/STM32F10x/pios_usart.c @@ -70,12 +70,12 @@ static bool PIOS_USART_validate(struct pios_usart_dev * usart_dev) return (usart_dev->magic == PIOS_USART_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_usart_dev * PIOS_USART_alloc(void) { struct pios_usart_dev * usart_dev; - usart_dev = (struct pios_usart_dev *)malloc(sizeof(*usart_dev)); + usart_dev = (struct pios_usart_dev *)pvPortMalloc(sizeof(*usart_dev)); if (!usart_dev) return(NULL); usart_dev->magic = PIOS_USART_DEV_MAGIC; diff --git a/flight/PiOS/STM32F10x/pios_usb_hid.c b/flight/PiOS/STM32F10x/pios_usb_hid.c index 0ebca1320..8644dd517 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid.c @@ -75,12 +75,12 @@ static bool PIOS_USB_HID_validate(struct pios_usb_hid_dev * usb_hid_dev) return (usb_hid_dev->magic == PIOS_USB_HID_DEV_MAGIC); } -#if defined(PIOS_INCLUDE_FREERTOS) && 0 +#if defined(PIOS_INCLUDE_FREERTOS) static struct pios_usb_hid_dev * PIOS_USB_HID_alloc(void) { struct pios_usb_hid_dev * usb_hid_dev; - usb_hid_dev = (struct pios_usb_hid_dev *)malloc(sizeof(*usb_hid_dev)); + usb_hid_dev = (struct pios_usb_hid_dev *)pvPortMalloc(sizeof(*usb_hid_dev)); if (!usb_hid_dev) return(NULL); usb_hid_dev->magic = PIOS_USB_HID_DEV_MAGIC;