diff options
| -rw-r--r-- | src/cc1111/ao_arch.h | 18 | ||||
| -rw-r--r-- | src/cc1111/ao_string.c | 23 | ||||
| -rw-r--r-- | src/core/ao.h | 6 | ||||
| -rw-r--r-- | src/core/ao_config.c | 2 | ||||
| -rw-r--r-- | src/core/ao_host.h | 4 | ||||
| -rw-r--r-- | src/core/ao_telemetry.c | 8 | ||||
| -rw-r--r-- | src/drivers/ao_gps_skytraq.c | 5 | 
7 files changed, 44 insertions, 22 deletions
| diff --git a/src/cc1111/ao_arch.h b/src/cc1111/ao_arch.h index f0f0daae..001165fa 100644 --- a/src/cc1111/ao_arch.h +++ b/src/cc1111/ao_arch.h @@ -27,6 +27,12 @@  /* Convert a __data pointer into an __xdata pointer */  #define DATA_TO_XDATA(a)	((void __xdata *) ((uint8_t) (a) | 0xff00)) +/* Code and xdata use the same address space */ +#define CODE_TO_XDATA(a)	((__xdata void *) ((uint16_t) (a))) + +/* Pdata lives at the start of xdata */ +#define PDATA_TO_XDATA(a)	((void __xdata *) ((uint8_t) (a) | 0xf000)) +  /* Stack runs from above the allocated __data space to 0xfe, which avoids   * writing to 0xff as that triggers the stack overflow indicator   */ @@ -228,18 +234,18 @@ ao_button_get(void) __critical;  /* ao_string.c */  void -_ao_xmemcpy(__xdata uint8_t *dst, __xdata uint8_t *src, uint8_t count); +_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count); -#define ao_xmemcpy(d,s,c) _ao_xmemcpy((__xdata uint8_t *) (d), (__xdata uint8_t *) (s), (c)) +#define ao_xmemcpy(d,s,c) _ao_xmemcpy(d,s,c)  void -_ao_xmemset(__xdata uint8_t *dst, uint8_t value, uint8_t count); +_ao_xmemset(__xdata void *dst, uint8_t value, uint8_t count); -#define ao_xmemset(d,v,c) _ao_xmemset((__xdata uint8_t *) (d), (v), (c)) +#define ao_xmemset(d,v,c) _ao_xmemset(d,v,c)  int8_t -_ao_xmemcmp(__xdata uint8_t *a, __xdata uint8_t *b, uint8_t count); +_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count); -#define ao_xmemcmp(d,s,c) _ao_xmemcmp((__xdata uint8_t *) (d), (__xdata uint8_t *) (s), (c)) +#define ao_xmemcmp(d,s,c) _ao_xmemcmp((d), (s), (c))  #endif /* _AO_ARCH_H_ */ diff --git a/src/cc1111/ao_string.c b/src/cc1111/ao_string.c index daa5c14b..3a07e47e 100644 --- a/src/cc1111/ao_string.c +++ b/src/cc1111/ao_string.c @@ -18,26 +18,33 @@  #include "ao.h"  void -_ao_xmemcpy(__xdata uint8_t *dst, __xdata uint8_t *src, uint8_t count) +_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count)  { -	while (count--) -		*dst++ = *src++; +	while (count--) { +		*(__xdata uint8_t *) dst = *(__xdata uint8_t *) src; +		dst = (__xdata uint8_t *) dst + 1; +		src = (__xdata uint8_t *) src + 1; +	}  }  void -_ao_xmemset(__xdata uint8_t *dst, uint8_t v, uint8_t count) +_ao_xmemset(__xdata void *dst, uint8_t v, uint8_t count)  { -	while (count--) -		*dst++ = v; +	while (count--) { +		*(__xdata uint8_t *) dst = v; +		dst = (__xdata uint8_t *) dst + 1; +	}  }  int8_t -_ao_xmemcmp(__xdata uint8_t *a, __xdata uint8_t *b, uint8_t count) +_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count)  {  	while (count--) { -		int8_t	d = *a++ - *b++; +		int8_t	d = *(__xdata int8_t *) a - *(__xdata int8_t *) b;  		if (d)  			return d; +		a = (__xdata int8_t *) a + 1; +		b = (__xdata int8_t *) b + 1;  	}  	return 0;  } diff --git a/src/core/ao.h b/src/core/ao.h index 9b8d3270..cbe2f8dc 100644 --- a/src/core/ao.h +++ b/src/core/ao.h @@ -32,6 +32,12 @@  #ifndef DATA_TO_XDATA  #define DATA_TO_XDATA(a)	(a)  #endif +#ifndef PDATA_TO_XDATA +#define PDATA_TO_XDATA(a)	(a) +#endif +#ifndef CODE_TO_XDATA +#define CODE_TO_XDATA(a)	(a) +#endif  /* An AltOS task */  struct ao_task { diff --git a/src/core/ao_config.c b/src/core/ao_config.c index 08cc79b1..f0a576ee 100644 --- a/src/core/ao_config.c +++ b/src/core/ao_config.c @@ -79,7 +79,7 @@ _ao_config_get(void)  		ao_config.main_deploy = AO_CONFIG_DEFAULT_MAIN_DEPLOY;  		ao_config.radio_channel = AO_CONFIG_DEFAULT_RADIO_CHANNEL;  		ao_xmemset(&ao_config.callsign, '\0', sizeof (ao_config.callsign)); -		ao_xmemcpy(&ao_config.callsign, AO_CONFIG_DEFAULT_CALLSIGN, +		ao_xmemcpy(&ao_config.callsign, CODE_TO_XDATA(AO_CONFIG_DEFAULT_CALLSIGN),  		       sizeof(AO_CONFIG_DEFAULT_CALLSIGN) - 1);  		ao_config_dirty = 1;  	} diff --git a/src/core/ao_host.h b/src/core/ao_host.h index f2b2f0c9..6eb752c9 100644 --- a/src/core/ao_host.h +++ b/src/core/ao_host.h @@ -46,6 +46,10 @@ struct ao_adc {  #define __code  #define __reentrant +#define DATA_TO_XDATA(a)	(a) +#define PDATA_TO_XDATA(a)	(a) +#define CODE_TO_XDATA(a)	(a) +  enum ao_flight_state {  	ao_flight_startup = 0,  	ao_flight_idle = 1, diff --git a/src/core/ao_telemetry.c b/src/core/ao_telemetry.c index e66598d1..c68f1589 100644 --- a/src/core/ao_telemetry.c +++ b/src/core/ao_telemetry.c @@ -132,11 +132,11 @@ ao_send_configuration(void)  		telemetry.configuration.main_deploy = ao_config.main_deploy;  		telemetry.configuration.flight_log_max = ao_config.flight_log_max >> 10;  		ao_xmemcpy (telemetry.configuration.callsign, -			ao_config.callsign, -			AO_MAX_CALLSIGN); +			    ao_config.callsign, +			    AO_MAX_CALLSIGN);  		ao_xmemcpy (telemetry.configuration.version, -			ao_version, -			AO_MAX_VERSION); +			    CODE_TO_XDATA(ao_version), +			    AO_MAX_VERSION);  		ao_radio_send(&telemetry, sizeof (telemetry));  		ao_telemetry_config_cur = ao_telemetry_config_max;  	} diff --git a/src/drivers/ao_gps_skytraq.c b/src/drivers/ao_gps_skytraq.c index 1d457a1f..62909606 100644 --- a/src/drivers/ao_gps_skytraq.c +++ b/src/drivers/ao_gps_skytraq.c @@ -285,7 +285,7 @@ ao_nmea_gga(void)  	if (!ao_gps_error) {  		ao_mutex_get(&ao_gps_mutex);  		ao_gps_tick = ao_gps_next_tick; -		ao_xmemcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data)); +		ao_xmemcpy(&ao_gps_data, PDATA_TO_XDATA(&ao_gps_next), sizeof (ao_gps_data));  		ao_mutex_put(&ao_gps_mutex);  		ao_wakeup(&ao_gps_data);  	} @@ -343,8 +343,7 @@ ao_nmea_gsv(void)  		ao_gps_tracking_next.channels = 0;  	else if (done) {  		ao_mutex_get(&ao_gps_mutex); -		ao_xmemcpy(&ao_gps_tracking_data, &ao_gps_tracking_next, -		       sizeof(ao_gps_tracking_data)); +		ao_xmemcpy(&ao_gps_tracking_data, PDATA_TO_XDATA(&ao_gps_tracking_next), sizeof(ao_gps_tracking_data));  		ao_mutex_put(&ao_gps_mutex);  		ao_wakeup(&ao_gps_tracking_data);  	} | 
