diff --git a/.travis.yml b/.travis.yml index b15bc89e5..0ce5d9c42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,12 @@ addons: script: - set -e - export CXX="g++-4.8" CC="gcc-4.8" GCOV="gcov-4.8" + - echo -e "travis_fold:start:host_tests" - pushd $TRAVIS_BUILD_DIR/tests/host - make - make clean-objects + - echo -e "travis_fold:end:host_tests" + - echo -e "travis_fold:start:sketch_test_env_prepare" - popd - wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz - tar xf arduino.tar.xz @@ -26,15 +29,18 @@ script: - ln -s $TRAVIS_BUILD_DIR esp8266 - cd esp8266/tools - python get.py - - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16 - - sleep 3 - - export DISPLAY=:1.0 - - export PATH="$HOME/arduino_ide:$PATH" + - export PATH="$HOME/arduino_ide:$TRAVIS_BUILD_DIR/tools/xtensa-lx106-elf/bin:$PATH" - which arduino - cd $TRAVIS_BUILD_DIR - source tests/common.sh - install_libraries - - build_sketches $HOME/arduino_ide $TRAVIS_BUILD_DIR "python tools/build.py -l $HOME/Arduino/libraries -b generic -v" + - echo -e "travis_fold:end:sketch_test_env_prepare" + - echo -e "travis_fold:start:sketch_test" + - build_sketches $HOME/arduino_ide $TRAVIS_BUILD_DIR "-l $HOME/Arduino/libraries" + - echo -e "travis_fold:end:sketch_test" + - echo -e "travis_fold:start:size_report" + - cat size.log + - echo -e "travis_fold:end:size_report" after_success: - pushd $TRAVIS_BUILD_DIR/tests/host diff --git a/README.md b/README.md index 1affadda4..cbb7da28a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and Starting with 1.6.4, Arduino allows installation of third-party platform packages using Boards Manager. We have packages available for Windows, Mac OS, and Linux (32 and 64 bit). -- Install Arduino 1.6.5 from the [Arduino website](http://www.arduino.cc/en/main/software). +- Install Arduino 1.6.8 from the [Arduino website](http://www.arduino.cc/en/main/software). - Start Arduino and open Preferences window. - Enter ```http://arduino.esp8266.com/stable/package_esp8266com_index.json``` into *Additional Board Manager URLs* field. You can add multiple URLs, separating them with commas. - Open Boards Manager from Tools > Board menu and install *esp8266* platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation). @@ -44,7 +44,7 @@ Documentation: [http://esp8266.github.io/Arduino/versions/2.1.0-rc2/](http://esp ### Using git version [![Linux build status](https://travis-ci.org/esp8266/Arduino.svg)](https://travis-ci.org/esp8266/Arduino) [![codecov.io](https://codecov.io/github/esp8266/Arduino/coverage.svg?branch=master)](https://codecov.io/github/esp8266/Arduino?branch=master) -- Install Arduino 1.6.7 +- Install Arduino 1.6.8 - Go to Arduino directory - Clone this repository into hardware/esp8266com/esp8266 directory (or clone it elsewhere and create a symlink) ```bash diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 405a94c8e..80b041196 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -55,7 +55,8 @@ enum RFMode { RF_DISABLED = 4 // disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current. }; -#define RF_MODE(mode) extern "C" int __get_rf_mode() { return mode; } +#define RF_MODE(mode) int __get_rf_mode() { return mode; } +#define RF_PRE_INIT() void __run_user_rf_pre_init() // compatibility definitions #define WakeMode RFMode @@ -71,7 +72,7 @@ enum ADCMode { ADC_VDD = 255 }; -#define ADC_MODE(mode) extern "C" int __get_adc_mode(void) { return (int) (mode); } +#define ADC_MODE(mode) int __get_adc_mode(void) { return (int) (mode); } typedef enum { FM_QIO = 0x00, diff --git a/cores/esp8266/Tone.cpp b/cores/esp8266/Tone.cpp index 9d262e3bb..bcdd358a8 100644 --- a/cores/esp8266/Tone.cpp +++ b/cores/esp8266/Tone.cpp @@ -113,11 +113,15 @@ void noTone(uint8_t _pin) { digitalWrite(_pin, LOW); } -void t1IntHandler() { - if (toggle_counts[T1INDEX] > 0){ +ICACHE_RAM_ATTR void t1IntHandler() { + if (toggle_counts[T1INDEX] != 0){ // toggle the pin digitalWrite(tone_pins[T1INDEX], toggle_counts[T1INDEX] % 2); toggle_counts[T1INDEX]--; + // handle the case of indefinite duration + if (toggle_counts[T1INDEX] < -2){ + toggle_counts[T1INDEX] = -1; + } }else{ disableTimer(T1INDEX); digitalWrite(tone_pins[T1INDEX], LOW); diff --git a/cores/esp8266/core_esp8266_phy.c b/cores/esp8266/core_esp8266_phy.c index acdbabf54..6b9b094eb 100644 --- a/cores/esp8266/core_esp8266_phy.c +++ b/cores/esp8266/core_esp8266_phy.c @@ -242,6 +242,14 @@ static const uint8_t ICACHE_FLASH_ATTR phy_init_data[128] = [114] = 2 }; +// These functions will be overriden from C++ code. +// Unfortunately, we can't use extern "C" because Arduino preprocessor +// doesn't generate forward declarations for extern "C" functions correctly, +// so we use mangled names here. +#define __get_adc_mode _Z14__get_adc_modev +#define __get_rf_mode _Z13__get_rf_modev +#define __run_user_rf_pre_init _Z22__run_user_rf_pre_initv + extern int __real_register_chipv6_phy(uint8_t* init_data); extern int __wrap_register_chipv6_phy(uint8_t* init_data) { if (init_data != NULL) { @@ -279,5 +287,6 @@ void user_rf_pre_init() { } system_set_os_print(0); + system_phy_set_rfoption(__get_rf_mode()); __run_user_rf_pre_init(); } diff --git a/cores/esp8266/core_esp8266_wiring.c b/cores/esp8266/core_esp8266_wiring.c index 0170b4bcf..3a8f0f293 100644 --- a/cores/esp8266/core_esp8266_wiring.c +++ b/cores/esp8266/core_esp8266_wiring.c @@ -59,17 +59,17 @@ void micros_overflow_tick(void* arg) { micros_at_last_overflow_tick = m; } -unsigned long millis() { +unsigned long ICACHE_RAM_ATTR millis() { uint32_t m = system_get_time(); uint32_t c = micros_overflow_count + ((m < micros_at_last_overflow_tick) ? 1 : 0); return c * 4294967 + m / 1000; } -unsigned long micros() { +unsigned long ICACHE_RAM_ATTR micros() { return system_get_time(); } -void delayMicroseconds(unsigned int us) { +void ICACHE_RAM_ATTR delayMicroseconds(unsigned int us) { os_delay_us(us); } diff --git a/cores/esp8266/core_esp8266_wiring_analog.c b/cores/esp8266/core_esp8266_wiring_analog.c index 74d5dd5d3..1ff1d264d 100644 --- a/cores/esp8266/core_esp8266_wiring_analog.c +++ b/cores/esp8266/core_esp8266_wiring_analog.c @@ -1,9 +1,9 @@ -/* +/* analog.c - analogRead implementation for esp8266 Copyright (c) 2015 Hristo Gochkov. All rights reserved. This file is part of the esp8266 core for Arduino environment. - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either @@ -17,8 +17,8 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - + + 18/06/2015 analogRead bugfix by Testato */ @@ -26,11 +26,13 @@ #include "pins_arduino.h" -extern int __analogRead(uint8_t pin) { - if(pin == 17){ - return system_adc_read(); - } - return digitalRead(pin) * 1023; +extern int __analogRead(uint8_t pin) +{ + // accept both A0 constant and ADC channel number + if(pin == 17 || pin == 0) { + return system_adc_read(); + } + return digitalRead(pin) * 1023; } extern int analogRead(uint8_t pin) __attribute__ ((weak, alias("__analogRead"))); diff --git a/doc/installing.md b/doc/installing.md index 16ba27a00..55b03fe32 100644 --- a/doc/installing.md +++ b/doc/installing.md @@ -7,7 +7,7 @@ title: Installation This is the suggested installation method for end users. ### Prerequisites -- Arduino 1.6.5, get it from [Arduino website](https://www.arduino.cc/en/Main/OldSoftwareReleases#previous). Arduino 1.6.6 has several issues, so we recommend to stick with 1.6.5 for now. +- Arduino 1.6.8, get it from [Arduino website](https://www.arduino.cc/en/Main/OldSoftwareReleases#previous). - Internet connection ### Instructions @@ -27,7 +27,7 @@ This is the suggested installation method for contributors and library developer ### Prerequisites -- Arduino 1.6.5 (or newer, if you know what you are doing) +- Arduino 1.6.8 (or newer, if you know what you are doing) - git - python 2.7 - terminal, console, or command prompt (depending on you OS) diff --git a/tests/common.sh b/tests/common.sh index 8f3f083b0..a3cc30f36 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -1,13 +1,49 @@ -#!/bin/bash +#!/usr/bin/env bash + +function print_size_info() +{ + elf_file=$1 + + if [ -z "$elf_file" ]; then + printf "sketch data rodata bss text irom0.text dram flash\n" + return 0 + fi + + elf_name=$(basename $elf_file) + sketch_name="${elf_name%.*}" + # echo $sketch_name + declare -A segments + while read -a tokens; do + seg=${tokens[0]} + seg=${seg//./} + size=${tokens[1]} + addr=${tokens[2]} + if [ "$addr" -eq "$addr" -a "$addr" -ne "0" ] 2>/dev/null; then + segments[$seg]=$size + fi + + + done < <(xtensa-lx106-elf-size --format=sysv $elf_file) + + total_ram=$((${segments[data]} + ${segments[rodata]} + ${segments[bss]})) + total_flash=$((${segments[data]} + ${segments[rodata]} + ${segments[text]} + ${segments[irom0text]})) + + printf "%-28s %-8d %-8d %-8d %-8d %-8d %-8d %-8d\n" $sketch_name ${segments[data]} ${segments[rodata]} ${segments[bss]} ${segments[text]} ${segments[irom0text]} $total_ram $total_flash + return 0 +} function build_sketches() { set +e local arduino=$1 local srcpath=$2 - local build_cmd=$3 - echo $build_cmd + local build_arg=$3 + local build_dir=build.tmp + mkdir -p $build_dir + rm -rf $build_dir/* + local build_cmd="python tools/build.py -b generic -v -k -p $PWD/$build_dir $build_arg " local sketches=$(find $srcpath -name *.ino) + print_size_info >size.log export ARDUINO_IDE_PATH=$arduino for sketch in $sketches; do local sketchdir=$(dirname $sketch) @@ -33,6 +69,7 @@ function build_sketches() return $result fi rm build.log + print_size_info $build_dir/*.elf >>size.log done set -e } diff --git a/tests/test_overrides/test_overrides.ino b/tests/test_overrides/test_overrides.ino new file mode 100644 index 000000000..fe963492f --- /dev/null +++ b/tests/test_overrides/test_overrides.ino @@ -0,0 +1,11 @@ +ADC_MODE(ADC_VCC); +RF_MODE(RF_DISABLED); +RF_PRE_INIT() +{ +} + +void setup() { +} + +void loop() { +}