diff --git a/.gitignore b/.gitignore index c523b483..908c9e9c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ *.swp *.bin .* +cscope.* diff --git a/cores/arduino/CDCSerialClass.cpp b/cores/arduino/CDCSerialClass.cpp index 740375de..ad5c569e 100644 --- a/cores/arduino/CDCSerialClass.cpp +++ b/cores/arduino/CDCSerialClass.cpp @@ -120,7 +120,8 @@ int CDCSerialClass::read( void ) void CDCSerialClass::flush( void ) { - while (_tx_buffer->tail != _tx_buffer->head) { + while (_tx_buffer->tail != _tx_buffer->head) { /* This infinite loop is intentional + and requested by design */ delayMicroseconds(1); } } diff --git a/cores/arduino/i2c.c b/cores/arduino/i2c.c index a23e76ff..1a674fee 100644 --- a/cores/arduino/i2c.c +++ b/cores/arduino/i2c.c @@ -110,6 +110,7 @@ int i2c_openadapter(void) SET_PIN_PULLUP(25, 1); i2c_cfg_data_t i2c_cfg; + memset(&i2c_cfg, 0, sizeof(i2c_cfg_data_t)); i2c_cfg.speed = I2C_SLOW; i2c_cfg.addressing_mode = I2C_7_Bit; diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 47671266..11f7c374 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -42,7 +42,7 @@ int main( void ) setup(); - for (;;) + for (;;) /* This infinite loop is intentional and requested by design */ { loop(); if (serialEventRun) serialEventRun(); diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c index 28637bea..634fe75c 100644 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -29,31 +29,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #define FREQ_MHZ ((ARCV2_TIMER0_CLOCK_FREQ)/1000000) static const uint64_t MS_TO_CLKS = (FREQ_MHZ * 1000); -static uint64_t getTimeStampClks(void) +static inline __attribute__((always_inline)) +uint64_t getTimeStampClks(void) { - __asm__ volatile ( - /* Disable interrupts - we don't want to be disturbed */ - "clri r2 \n\t" - /* Load in r1 value of timer0_overflows */ - "ld r1, %0 \n\t" - /* Read COUNT0 register */ - "lr r0, [0x21] \n\t" - /* Read CONTROL0 register */ - "lr r3, [0x22] \n\t" - /* If CONTROL0.IP is set COUNT0 reached LIMIT0 => r1 value might not be - * accurate => read COUNT0 again */ - "bbit0.nt r3, 3, end \n\t" - /* Read COUNT0 again*/ - "lr r0, [0x21] \n\t" - /* Timer0 overflowed => timer0_overflows++ */ - "add r1, r1, 1 \n\t" - /***/ - "end: \n\t" - "seti r2 \n\t" - : /* Output parameters and their constraints */ - : "m"(timer0_overflows) /* Input parameters and their constraints */ - : "r0", "r1", "r2", "r3" /* Killed registers */ - ); + uint32_t time_stamp; + int key = interrupt_lock(); + uint64_t ret = timer0_overflows; + time_stamp = aux_reg_read(ARC_V2_TMR0_COUNT); + if (aux_reg_read(ARC_V2_TMR0_CONTROL) & (0x01 << 3)) { + time_stamp = aux_reg_read(ARC_V2_TMR0_COUNT); + ret++; + } + interrupt_unlock(key); + return ((ret << 32) | time_stamp); } void delay(uint32_t msec) diff --git a/libraries/CurieBle/src/BleCharacteristic.cpp b/libraries/CurieBle/src/BleCharacteristic.cpp index 3fb124ac..d3a088c7 100644 --- a/libraries/CurieBle/src/BleCharacteristic.cpp +++ b/libraries/CurieBle/src/BleCharacteristic.cpp @@ -165,6 +165,9 @@ BleCharacteristic::_setValue(void) if (!_initialised) return BLE_STATUS_WRONG_STATE; + if ((_data_len > BLE_MAX_ATTR_DATA_LEN) || (_data_len > _char_data.max_len)) + return BLE_STATUS_NOT_ALLOWED; + status = ble_client_gatts_set_attribute_value(_handles.value_handle, _data_len, _data, 0); if (BLE_STATUS_SUCCESS != status) @@ -201,7 +204,7 @@ BleStatus BleCharacteristic::setValue(const String &str) { str.getBytes((unsigned char *)&_data, (unsigned int)_char_data.max_len, 0U); - _data_len = str.len + 1; + _data_len = str.length() + 1; return _setValue(); } diff --git a/libraries/CurieBle/src/BleDescriptor.cpp b/libraries/CurieBle/src/BleDescriptor.cpp index 3442f1a0..712f5394 100644 --- a/libraries/CurieBle/src/BleDescriptor.cpp +++ b/libraries/CurieBle/src/BleDescriptor.cpp @@ -70,6 +70,9 @@ BleDescriptor::_setValue(void) if (!_initialised) return BLE_STATUS_WRONG_STATE; + if (_desc.length > BLE_MAX_ATTR_DATA_LEN) + return BLE_STATUS_NOT_ALLOWED; + return ble_client_gatts_set_attribute_value(_handle, _desc.length, _data, 0); } @@ -93,7 +96,7 @@ BleStatus BleDescriptor::setValue(const String &str) { str.getBytes((unsigned char *)&_data, (unsigned int)BLE_MAX_ATTR_DATA_LEN, 0U); - _desc.length = str.len + 1; + _desc.length = str.length() + 1; return _setValue(); } diff --git a/libraries/CurieBle/src/BleDevice.cpp b/libraries/CurieBle/src/BleDevice.cpp index 6c1a95ad..d3586932 100644 --- a/libraries/CurieBle/src/BleDevice.cpp +++ b/libraries/CurieBle/src/BleDevice.cpp @@ -387,6 +387,7 @@ BlePeripheral::getLocalAddress(BleDeviceAddress &address) const return BLE_STATUS_WRONG_STATE; ble_addr_t bda; + memset(&bda, 0, sizeof(ble_addr_t)); status = ble_client_gap_get_bda(&bda); if (BLE_STATUS_SUCCESS != status) return status; diff --git a/system/libarc32_arduino101/bootcode/interrupt.c b/system/libarc32_arduino101/bootcode/interrupt.c index eb45fee2..0cca8f3c 100644 --- a/system/libarc32_arduino101/bootcode/interrupt.c +++ b/system/libarc32_arduino101/bootcode/interrupt.c @@ -32,7 +32,7 @@ struct _IsrTableEntry __attribute__((section(".data"))) _IsrTable[SS_NUM_IRQS]; static void _dummy_isr(void) { __asm__ ("flag 0x01"); /* Set the halt flag => halt the CPU */ - for(;;); + for(;;); /* This infinite loop is intentional and requested by design */ } void interrupt_connect(unsigned int irq, void (*isr)(void)) diff --git a/system/libarc32_arduino101/framework/src/cfw/service_manager.c b/system/libarc32_arduino101/framework/src/cfw/service_manager.c index 5452d52d..a6547a53 100644 --- a/system/libarc32_arduino101/framework/src/cfw/service_manager.c +++ b/system/libarc32_arduino101/framework/src/cfw/service_manager.c @@ -452,7 +452,7 @@ void _cfw_loop(void * queue) { struct cfw_message * message; T_QUEUE_MESSAGE m; - while (1) { + while (1) { /* This infinite loop is intentional and requested by design */ queue_get_message(queue, &m, OS_WAIT_FOREVER, NULL ); message = (struct cfw_message *) m; if (message != NULL ) { diff --git a/system/libarc32_arduino101/framework/src/infra/port.c b/system/libarc32_arduino101/framework/src/infra/port.c index 584f3f93..e9f7eef6 100644 --- a/system/libarc32_arduino101/framework/src/infra/port.c +++ b/system/libarc32_arduino101/framework/src/infra/port.c @@ -136,7 +136,7 @@ uint16_t port_alloc(void * queue) { struct port * ret = NULL; uint32_t flags = interrupt_lock(); - if (registered_port_count < MAX_PORTS) { + if ((registered_port_count < MAX_PORTS) && (registered_port_count >= 0)) { ports[registered_port_count].id = registered_port_count + 1; /* don't use 0 as port.*/ ports[registered_port_count].cpu_id = get_cpu_id(); /* is overwritten in case of ipc */ ports[registered_port_count].queue = queue; @@ -150,7 +150,10 @@ uint16_t port_alloc(void * queue) panic(E_OS_ERR_NO_MEMORY); } interrupt_unlock(flags); - return ret->id; + if (ret != NULL) + return ret->id; + else + return 0; } #else uint16_t port_alloc(void *queue) diff --git a/system/libarc32_arduino101/framework/src/os/os.c b/system/libarc32_arduino101/framework/src/os/os.c index ec4f3881..63aa31f6 100644 --- a/system/libarc32_arduino101/framework/src/os/os.c +++ b/system/libarc32_arduino101/framework/src/os/os.c @@ -41,12 +41,15 @@ void * cfw_alloc(int size, OS_ERR_TYPE * err) { void * ptr; unsigned int flags = interrupt_lock(); ptr = malloc(size+sizeof(void*)); - (*(int*) ptr) = size; + if (ptr != NULL) { + (*(int*) ptr) = size; #ifdef TRACK_ALLOCS - alloc_count++; + alloc_count++; #endif - interrupt_unlock(flags); - return ptr; + interrupt_unlock(flags); + return ptr; + } else + return 0; } void cfw_free(void * ptr, OS_ERR_TYPE * err) {