From 2193fec255eb9a039e931d0fa5e9f007e9f0e69e Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 7 Nov 2017 13:18:18 +0100 Subject: [PATCH 01/59] simple manual improvements in the compiled code --- test/pinmode/Makefile | 47 ++++++++ test/pinmode/README.md | 3 + test/pinmode/pinmode.c | 239 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 289 insertions(+) create mode 100644 test/pinmode/Makefile create mode 100644 test/pinmode/README.md create mode 100644 test/pinmode/pinmode.c diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile new file mode 100644 index 00000000..41fe4687 --- /dev/null +++ b/test/pinmode/Makefile @@ -0,0 +1,47 @@ +BASENAME=$(shell basename $$(pwd)) +EXECUTABLE=$(BASENAME).ihx + +#SDCCBASE=/usr/local +SDCCBASE=/opt/sdcc +BINDIR=$(SDCCBASE)/bin +CC=$(BINDIR)/sdcc +LD=$(BINDIR)/sdld + +LIBBASE=../../STM8S_StdPeriph_Driver +SDUINO=../../sduino + +CFLAGS= --debug -mstm8 -DF_CPU=16000000L -DSTM8S103 \ + -I. -I$(SDUINO) -I$(LIBBASE)/inc -I/usr/share/sdcc/include/ +# -DSUPPORT_ALTERNATE_MAPPINGS + +LDFLAGS=-L$(LIBBASE)/src -L/opt/sdcc/share/sdcc/lib/stm8 -lstm8s103 + +OBJECTS=$(BASENAME).rel +SDOBJECTS=main.rel wiring.rel wiring_digital.rel SPI.rel \ + HardwareSerial.rel Print.rel + +.PHONY: all clean flash + +#all: $(OBJECTS) + +$(EXECUTABLE): $(OBJECTS) $(SDOBJECTS) +#test.rel wiring_digital.rel + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ + +$(OBJECTS) : %.rel : %.c + $(CC) -c $(CFLAGS) $^ -o $@ + +$(SDOBJECTS) : %.rel : $(SDUINO)/%.c + $(CC) -c $(CFLAGS) $^ -o $@ + +flash: $(EXECUTABLE) + stm8flash -cstlinkv2 -pstm8s103?3 -w $^ + +readopt: + stm8flash -c stlinkv2 -p stm8s103?3 -s opt -r opt.bin + + +clean: + rm -f *.lib *.rst *.rel *.lst *.ihx *.sym *.asm *.lk *.map \ + *.cdb *.adb *~ *.bak + rm -f $(EXECUTABLE) diff --git a/test/pinmode/README.md b/test/pinmode/README.md new file mode 100644 index 00000000..bf981045 --- /dev/null +++ b/test/pinmode/README.md @@ -0,0 +1,3 @@ + 0080A0 47 _pinMode1: + 0081B4 268 _setup: + 0081BE 282 _loop: diff --git a/test/pinmode/pinmode.c b/test/pinmode/pinmode.c new file mode 100644 index 00000000..0ee2911f --- /dev/null +++ b/test/pinmode/pinmode.c @@ -0,0 +1,239 @@ +/* + * test spi functions + */ + +#include "Arduino.h" +#include "wiring_private.h" + +void pinMode1(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile GPIO_TypeDef *gpio; + + if (port == NOT_A_PIN) return; + + gpio = (GPIO_TypeDef *) portOutputRegister(port); + + if (mode == INPUT) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->CR1 &= ~bit; // release top side + gpio->DDR &= ~bit; // now set direction + END_CRITICAL + } else if (mode == INPUT_PULLUP) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->DDR &= ~bit; // set direction before + gpio->CR1 |= bit; // activating the pull up + END_CRITICAL + } else if (mode == OUTPUT_FAST) {// output push-pull, fast + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD) { // output open drain, slow + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } else { // output push-pull, slow + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } +} + +#if 0 + if (mode == INPUT) { + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->CR1 &= ~bit; // release top side + gpio->DDR &= ~bit; // now set direction + } else if (mode == INPUT_PULLUP) { + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->DDR &= ~bit; // set direction before + gpio->CR1 |= bit; // activating the pull up + + } else if (mode == OUTPUT_FAST) {// output push-pull, fast + gpio->CR1 |= bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + gpio->CR1 &= ~bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + + } else if (mode == OUTPUT_OD) { // output open drain, slow + gpio->CR1 &= ~bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + } else { // output push-pull, slow + gpio->CR1 |= bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + } +#endif + + +// +void pinMode_asm(uint8_t pin, uint8_t mode) +{ +__asm + sub sp, #16 +; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); + ldw x, #_digital_pin_to_bit_mask_PGM+0 + ld a, xl + add a, (0x13, sp) + rlwa x + adc a, #0x00 + ld xh, a + ld a, (x) + ld (0x04, sp), a +; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); + ldw x, #_digital_pin_to_port_PGM+0 + ld a, xl + add a, (0x13, sp) + rlwa x + adc a, #0x00 + ld xh, a + ld a, (x) + ld (0x03, sp), a + ld a, (0x03, sp) + ld (0x07, sp), a +; pinmode.c: 14: if (port == NOT_A_PIN) return; + tnz (0x03, sp) + jrne 00002$ + jp 00018$ +00002$: +; pinmode.c: 16: gpio = (GPIO_TypeDef *) portOutputRegister(port); + ldw x, #_port_to_output_PGM+0 + ldw (0x0e, sp), x + ld a, (0x07, sp) + ld xl, a + ld a, #0x02 + mul x, a + addw x, (0x0e, sp) + ldw x, (x) ; jetzt ist gpio in x + + ld a, (0x10, sp) ; bit + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit + ld a, (0x14, sp) ; a=mode, flags are set + +; gpio->DDR: (2,x) (war an c,SP) +; gpio->CR1: (3,x) (war an 8,SP) +; gpio->CR2: (4,x) (war an 5,SP) + + sim +; pinmode.c: 18: if (mode == INPUT) { + jrne 00016$ +; pinmode.c: 20: gpio->CR2 &= ~bit; // first: deactivate interrupt + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 21: gpio->CR1 &= ~bit; // release top side + ld a,yh + and a,(3,x) + ld (3,x),a +; pinmode.c: 22: gpio->DDR &= ~bit; // now set direction + ld a,yh + and a,(2,x) + jp 00022$ + +00016$: +; pinmode.c: 24: } else if (mode == INPUT_PULLUP) { + cp a, #0x02 + jrne 00013$ +; pinmode.c: 26: gpio->CR2 &= ~bit; // first: deactivate interrupt + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 27: gpio->DDR &= ~bit; // set direction before + ld a,yh + and a,(2,x) + ld (2,x),a +; pinmode.c: 28: gpio->CR1 |= bit; // activating the pull up + ld a,yl + or a,(3,x) + ld (3,x),a + jp 00018$ + +00013$: +; pinmode.c: 30: } else if (mode == OUTPUT_FAST) {// output push-pull, fast + cp a, #0x05 + jrne 00010$ +; pinmode.c: 32: gpio->CR1 |= bit; + ld a,yl + or a,(3,x) + jra 00020$ +; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to +; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt +00010$: +; pinmode.c: 36: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + cp a, #0x07 + jrne 00007$ +; pinmode.c: 38: gpio->CR1 &= ~bit; + ld a,yh + and a,(3,x) +00020$: ld (3,x),a +; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to + ld a,yl + or a,(2,x) + ld (2,x),a +; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt + ld a,yl + or a,(4,x) + ld (4,x),a + jra 00018$ + +00007$: +; pinmode.c: 42: } else if (mode == OUTPUT_OD) { // output open drain, slow + cp a, #0x03 + jrne 00004$ +; pinmode.c: 44: gpio->CR1 &= ~bit; + ld a,yh + and a,(3,x) + jra 00021$ +; pinmode.c: 45: gpio->CR2 &= ~bit; +; pinmode.c: 46: gpio->DDR |= bit; +00004$: +; pinmode.c: 50: gpio->CR1 |= bit; + ld a,yl + or a,(3,x) +00021$: ld (3,x),a +; pinmode.c: 51: gpio->CR2 &= ~bit; + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 52: gpio->DDR |= bit; + ld a,yl + or a,(2,x) +00022$: ld (2,x),a +00018$: + rim + addw sp, #16 +__endasm; +} +// + + +void setup(void) +{ + pinMode1(1,OUTPUT); +} + + +void loop (void) +{ +} From 612a82c54e065cac2bd2e4f4af9e5f50cb6fc6f0 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Fri, 6 Jan 2017 17:23:41 +0100 Subject: [PATCH 02/59] checked with simulator --- test/pinmode/README.md | 6 +++++ test/pinmode/pinmode.c | 50 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/test/pinmode/README.md b/test/pinmode/README.md index bf981045..1ef3c9a0 100644 --- a/test/pinmode/README.md +++ b/test/pinmode/README.md @@ -1,3 +1,9 @@ +original version (276 bytes) 0080A0 47 _pinMode1: 0081B4 268 _setup: 0081BE 282 _loop: +after first commit (176 bytes): + 0080A0 48 _pinMode1: + 0081B4 269 _pinMode_asm: + 008264 410 _setup: + 00826E 424 _loop: diff --git a/test/pinmode/pinmode.c b/test/pinmode/pinmode.c index 0ee2911f..3d443671 100644 --- a/test/pinmode/pinmode.c +++ b/test/pinmode/pinmode.c @@ -84,10 +84,34 @@ void pinMode1(uint8_t pin, uint8_t mode) } #endif +#if 0 +; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); + clrw x + ld a,(0x03, sp) + ld xl,a + addw x, #_digital_pin_to_bit_mask_PGM+0 + ld a, (x) ; bit + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit + +; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); + addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM + ld a, (x) ; port + jreq 00018$ + + sll + clrw + ld xl,a + addw x, #_port_to_output_PGM+0 ; x = gpio + ld a,(0x04,sp) ; a = mode, flags are set +#endif // void pinMode_asm(uint8_t pin, uint8_t mode) { + (void) pin; // empty code to avoid warning + (void) mode; __asm sub sp, #16 ; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); @@ -98,7 +122,7 @@ __asm adc a, #0x00 ld xh, a ld a, (x) - ld (0x04, sp), a + ld (0x04, sp), a ; bit := 4 ; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); ldw x, #_digital_pin_to_port_PGM+0 ld a, xl @@ -109,7 +133,7 @@ __asm ld a, (x) ld (0x03, sp), a ld a, (0x03, sp) - ld (0x07, sp), a + ld (0x07, sp), a ; port := 7 ; pinmode.c: 14: if (port == NOT_A_PIN) return; tnz (0x03, sp) jrne 00002$ @@ -125,7 +149,7 @@ __asm addw x, (0x0e, sp) ldw x, (x) ; jetzt ist gpio in x - ld a, (0x10, sp) ; bit + ld a, (0x04, sp) ; bit ld yl,a ; yl = bit cpl a ld yh,a ; yh = ~bit @@ -161,7 +185,7 @@ __asm ld (4,x),a ; pinmode.c: 27: gpio->DDR &= ~bit; // set direction before ld a,yh - and a,(2,x) +and a,(2,x) ld (2,x),a ; pinmode.c: 28: gpio->CR1 |= bit; // activating the pull up ld a,yl @@ -230,7 +254,23 @@ __endasm; void setup(void) { - pinMode1(1,OUTPUT); + // expected result: xx xx 00 00 00 + pinMode_asm(PA1,INPUT); + + // expected result: xx xx 20 20 00 + pinMode_asm(PB5,OUTPUT); + + // expected result: xx xx 00 10 00 + pinMode_asm(PC4,INPUT_PULLUP); + + // expected result: xx xx 20 10 00 + pinMode_asm(PC5,OUTPUT_OD); + + // expected result: xx xx 02 02 02 + pinMode_asm(PD1,OUTPUT_FAST); + + // expected result: xx xx 42 02 42 + pinMode_asm(PD6,OUTPUT_OD_FAST); } From b1b816fb46d117c40e01ad58ee96a418a19d0f96 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Wed, 11 Jan 2017 21:12:28 +0100 Subject: [PATCH 03/59] works, added check functions to the test example --- test/pinmode/Makefile | 9 ++++++++- test/pinmode/pinmode.c | 44 ++++++++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile index 41fe4687..d5603153 100644 --- a/test/pinmode/Makefile +++ b/test/pinmode/Makefile @@ -20,7 +20,7 @@ OBJECTS=$(BASENAME).rel SDOBJECTS=main.rel wiring.rel wiring_digital.rel SPI.rel \ HardwareSerial.rel Print.rel -.PHONY: all clean flash +.PHONY: all clean flash statistics #all: $(OBJECTS) @@ -41,6 +41,13 @@ readopt: stm8flash -c stlinkv2 -p stm8s103?3 -s opt -r opt.bin +# lists the length of functions and constants defined in the primary source +# file +statistics: $(EXECUTABLE) + grep "[0-9] _" $(BASENAME).rst |\ + awk 'BEGIN {print "length\tfunction\n------\t----------";}{ a=strtonum("0x"$$1);if (name) print a-s "\t" name; s=a; name=$$3}' + + clean: rm -f *.lib *.rst *.rel *.lst *.ihx *.sym *.asm *.lk *.map \ *.cdb *.adb *~ *.bak diff --git a/test/pinmode/pinmode.c b/test/pinmode/pinmode.c index 3d443671..49b59739 100644 --- a/test/pinmode/pinmode.c +++ b/test/pinmode/pinmode.c @@ -84,9 +84,17 @@ void pinMode1(uint8_t pin, uint8_t mode) } #endif -#if 0 +// +void pinMode_asm(uint8_t pin, uint8_t mode) +{ + (void) pin; // empty code to avoid warning + (void) mode; +__asm + sub sp, #16 +#if 1 ; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); clrw x + ld a,(0x03, sp) ld xl,a addw x, #_digital_pin_to_bit_mask_PGM+0 @@ -96,24 +104,17 @@ void pinMode1(uint8_t pin, uint8_t mode) ld yh,a ; yh = ~bit ; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); - addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM +;;hier addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM ld a, (x) ; port jreq 00018$ - sll - clrw + sll a + clrw x ld xl,a addw x, #_port_to_output_PGM+0 ; x = gpio ld a,(0x04,sp) ; a = mode, flags are set -#endif -// -void pinMode_asm(uint8_t pin, uint8_t mode) -{ - (void) pin; // empty code to avoid warning - (void) mode; -__asm - sub sp, #16 +#else ; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); ldw x, #_digital_pin_to_bit_mask_PGM+0 ld a, xl @@ -154,6 +155,7 @@ __asm cpl a ld yh,a ; yh = ~bit ld a, (0x14, sp) ; a=mode, flags are set +#endif ; gpio->DDR: (2,x) (war an c,SP) ; gpio->CR1: (3,x) (war an 8,SP) @@ -252,25 +254,43 @@ __endasm; // +uint8_t checkresult(uint8_t *adr, uint8_t *data) +{ + uint8_t i,ok; + + ok = 1; + for (i=0; i<3; ++i) { + if (adr[2+i] != data[i]) ok=0; + } + return ok; +} + + void setup(void) { // expected result: xx xx 00 00 00 pinMode_asm(PA1,INPUT); + checkresult(GPIOA_BaseAddress, "\x00\x00\x00"); // expected result: xx xx 20 20 00 pinMode_asm(PB5,OUTPUT); + checkresult(GPIOB_BaseAddress, "\x20\x20\x00"); // expected result: xx xx 00 10 00 pinMode_asm(PC4,INPUT_PULLUP); + checkresult(GPIOC_BaseAddress, "\x00\x10\x00"); // expected result: xx xx 20 10 00 pinMode_asm(PC5,OUTPUT_OD); + checkresult(GPIOC_BaseAddress, "\x20\x10\x00"); // expected result: xx xx 02 02 02 pinMode_asm(PD1,OUTPUT_FAST); + checkresult(GPIOD_BaseAddress, "\x02\x02\x02"); // expected result: xx xx 42 02 42 pinMode_asm(PD6,OUTPUT_OD_FAST); + checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); } From 6236510b3506ded2d24eb7fcaf4917ebb4af0610 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Sat, 8 Dec 2018 12:29:49 +0100 Subject: [PATCH 04/59] forgot to update some documentation and the README --- CHANGELOG.md | 4 ++++ README.md | 27 ++++++++++++++++++++------- board-manager/Makefile | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 964b91d2..48f5fd8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,16 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] + + +## [0.4.0 - 2018-12-07] ### Added - using stm8gal to upload using the builtin bootloader of larger STM8 devices - Support for STM8S105K4 breakout board (stm8sblack) - Support for Sduino-UNO board (s8uno) - Support for Sduino MB board (mb208) - Unlocking a MCU by using Tools->Burn Bootloader in the Arduino IDE +- new library LiquidCrystal_I2C for text LCD with I2C converter backpack - new library LiquidCrystal_pcf2119 for I2C text LCD based on the PCF2119 - new library Wire for I2C communication - new library EEPROM diff --git a/README.md b/README.md index 4b508e73..6efbe678 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,16 @@ Now you should find a new entry *STM8S Boards* in the list at ## Known issues -The Arduino IDE Version 1.8.7 suffers from a known regression bug. If you -see the error message "select upload port first" apply this +**select upload port first**: The Arduino IDE version 1.8.7 suffers from a +known regression bug. If you see this error message update to Arduino IDE +version 1.8.8 or apply this [workaround](https://github.com/tenbaht/sduino/issues/68#issuecomment-441425529). +**bash.exe: warning: could not find /tmp, please create!**: Shows up on windows +systems. Annoying, but harmless. +[Workaround](https://github.com/tenbaht/sduino/issues/61#issuecomment-443551180) + + ## Included libraries @@ -69,24 +75,31 @@ guide](https://tenbaht.github.io/sduino/api/migration/) for details. #### Communication * SPI: Real hardware-SPI up to 10MHz. +* Wire: Port of the stock Wire library for I2C communication (with + improvements) * I2C: Port of the I2C master library by Wayne Truchsess * HardwareSerial: The standard serial interface. #### Displays * LiquidCrystal: HD44780 based text LCDs +* LiquidCrystal_I2C: HD44780 based text LCDs with I2C converter backpack +* LiquidCrystal_pcf2119: PCF2119 based text LCDs with I2C connection * PCD8544: Monochrome graphical LCD based on the PCD8544 controller like the Nokia 5110 display. SPI mode only. * Mini_SSD1306: SSD1306-based monochrome OLED displays with 128x64 pixels. I2C support only. +#### Storage + +* EEPROM: Port of the stock EEPROM library for accessing the buildin EEPROM + #### Motor control * Stepper: Stepper motors with 2, 4 or 5 phases. * Servo: Up to 12 servos using only 1 timer. - ## Compatibility with the Arduino world Since there is no free C++ for the STM8, it is impossible to do a full 1:1 @@ -104,15 +117,15 @@ guide](https://tenbaht.github.io/sduino/api/migration/) for an overview. ## Supported Systems: -Arduino IDE versions 1.8.7, 1.8.5 and 1.6.13 are tested, but any version >=1.6.6 -should work. +Arduino IDE versions 1.8.8, 1.8.7, 1.8.5 and 1.6.13 are tested, but any +version >=1.6.6 should work. Version 1.8.7 might require a [workaround](https://github.com/tenbaht/sduino/issues/68#issuecomment-441425529) if you see an error message "select upload port first". -* Linux 64 bit: Tested on Ubuntu 16.04 -* Linux 32 bit: Tested on Ubuntu 16.04 +* Linux 64 bit: Tested on Mint 19/Ubuntu 18.04 +* Linux 32 bit: Tested on Mint 19/Ubuntu 18.04 * Windows: Tested on Windows 7. Sduino might work on XP (not tested), but the ST-Link/V2 driver is not available anymore for XP. * MacOS: tested on 10.13. diff --git a/board-manager/Makefile b/board-manager/Makefile index e54dc5f9..f62db2f9 100644 --- a/board-manager/Makefile +++ b/board-manager/Makefile @@ -46,7 +46,7 @@ DATE=$(shell date '+%F') release: # update the version number in the changelog if not already done: grep -q "$(COREVERSION)" ../CHANGELOG.md || \ - sed "/^## \[Unreleased\]/ a\\\n\n## [$(COREVERSION) - $(DATE)]" ../CHANGELOG.md + sed -i "/^## \[Unreleased\]/ a\\\n\n## [$(COREVERSION) - $(DATE)]" ../CHANGELOG.md git add ../CHANGELOG.md ../$(PACKAGEFILE) git add parts/tools-*-$(SDCCVERSION).txt parts/tools-*-$(TOOLSVERSION).txt parts/platform-*-$(COREVERSION).txt git commit From 511cecadc12942d10cc44de039408aff89d85015 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 11:15:12 +0100 Subject: [PATCH 05/59] define vprint to allow for easier verbose and debug output --- .../sduino/tools/wrapper/sdcc-link.sh | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh index f731392f..969c842b 100755 --- a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh +++ b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh @@ -1,18 +1,48 @@ #!/bin/bash -# usage: sdcc-link [.lib and .rel files] re5 [other flags and files] +# usage: sdcc-link [options] [.lib and .rel files] re5 [other flags and files] +# +# possible script options (options in this order only): +# -v: verbose +# -d: debug mode (more verbose), includes coloring the output +# -c: color the output + + +### local functions ###################################################### + +# verbose print +# +# usage: vprint min_level msg +# +# prints a message if the verbosity level is equal or higher than the required +# min_level +# +vprint () +{ + local level=$1 + + shift + if [ $VERBOSE -ge $level ]; then + echo -e "$@" + fi +} + VERBOSE=0 USE_COLOR=0 if [ "$1" == "-v" ]; then VERBOSE=1; shift -elif [ "$1" == "-vv" ]; then +elif [ "$1" == "-d" ]; then VERBOSE=2 -# USE_COLOR=1 + USE_COLOR=1 set -x shift fi +if [ "$1" == "-c" ]; then + USE_COLOR=1; + shift +fi if [ $USE_COLOR -gt 0 ]; then @@ -61,12 +91,8 @@ fi SDCC="$1" shift -if [ $VERBOSE ]; then - # echo the full command line in cyan: - >&2 echo -ne "${CYAN}" - >&2 echo -n "${@}" - >&2 echo -e "${OFF}" -fi +# echo the full command line in cyan on stderr: +>&2 vprint 1 "${CYAN}${@}${OFF}" declare -a OBJS while [ $# -gt 0 ]; do @@ -83,11 +109,7 @@ while [ $# -gt 0 ]; do shift done -if [ $VERBOSE ]; then - echo -ne "cmd: ${ORANGE}" - echo -n "$SDCC" "${OBJS[@]}" - echo -e "${OFF}" -fi +vprint 1 "cmd: ${ORANGE}$SDCC $line${OFF}" "$SDCC" "${OBJS[@]}" # propagate the sdcc exit code From 9f34700435f13f669e850d0759373d0847da546d Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 11:19:54 +0100 Subject: [PATCH 06/59] use expr command for filename matching (prepare for busybox) --- .../hardware/sduino/tools/wrapper/sdcc-link.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh index 969c842b..f3bdea65 100755 --- a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh +++ b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh @@ -94,11 +94,25 @@ shift # echo the full command line in cyan on stderr: >&2 vprint 1 "${CYAN}${@}${OFF}" + +# The arduino system insists on a *.a file for a library, but sdar requires +# them to be named *.lib. +# +# Workaround: copy all *.lib files into *.a files. +# +# Iterate over all positional parameters with a for loop. +# The pattern match for filename is easy for bash and dash, but busybox ash +# requires the use of the 'expr' command: +# +# bash, dash: if [[ "$FILE" == *.a ]]; then +# ash uses 'expr': expr "$FILE" : ".*\.a$"; then + declare -a OBJS while [ $# -gt 0 ]; do echo $1 FILE=$1 - if [[ "$FILE" == *.a ]]; then +# if [[ "$FILE" == *.a ]]; then # easy, but bash and dash only + if expr "$FILE" : ".*\.a$"; then # bash, dash, busybox ash FILE=${FILE%.a}.lib cp -a "$1" "$FILE" fi From ac534a15d346815bc0245999701e93c57b6179fb Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 11:57:43 +0100 Subject: [PATCH 07/59] combine all arguments into one line instead of using an array --- .../sduino/tools/wrapper/sdcc-link.sh | 86 +++++++++++-------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh index f3bdea65..3c86123d 100755 --- a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh +++ b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh @@ -28,6 +28,11 @@ vprint () } +# parse the script options +# +# This is very crude. The options are allowed only as the very first argments +# and they are required to be used in exactly this order. + VERBOSE=0 USE_COLOR=0 if [ "$1" == "-v" ]; then @@ -45,6 +50,8 @@ if [ "$1" == "-c" ]; then fi +# define color codes + if [ $USE_COLOR -gt 0 ]; then # ANSI color codes to beautify the output: BLACK='\033[0;30m' @@ -66,27 +73,6 @@ WHITE='\033[1;37m' OFF='\033[0m' fi -# check if cp is in the path using 'command -v' (a builtin POSIX function) -if ! command -v cp > /dev/null; then - # Ok, this means we are on a Windows system and we have to find a - # way to access cp and rm in ../win. A simple 'cd ../win' or - # '../win/cp' does't work, as the current working directory is still - # the Arduino binary directory. - # - # This looks ok, but it doesn't work on some Windows systems: - # (No idea why) - # PATH="${0%/wrapper/*}"/win:$PATH - # - # This is technically wrong, but surprisingly it works with Windows: - # cd $0/../.. - # PATH=$(pwd)/win:$PATH - # - # Use cd/pwd as a replacement for 'realpath' using only builtins. - # It has the positive side effect of converting from Windows to Unix - # path syntax avoiding all these backslash issues. - cd "${0%/wrapper/*}" - PATH=$(pwd)/win:$PATH -fi SDCC="$1" shift @@ -106,25 +92,55 @@ shift # # bash, dash: if [[ "$FILE" == *.a ]]; then # ash uses 'expr': expr "$FILE" : ".*\.a$"; then - -declare -a OBJS -while [ $# -gt 0 ]; do - echo $1 - FILE=$1 -# if [[ "$FILE" == *.a ]]; then # easy, but bash and dash only +# +# This is all pure POSIX, it works for bash, dash and busybox ash +vprint 2 "copy *.a to *.lib" +for FILE; do + vprint 2 "- checking parameter '$FILE'" if expr "$FILE" : ".*\.a$"; then # bash, dash, busybox ash - FILE=${FILE%.a}.lib - cp -a "$1" "$FILE" - fi - if [[ "$FILE" == *.o ]]; then - FILE=${FILE%.o}.rel + NEW=${FILE%.a}.lib + vprint 1 "copy $FILE to $NEW" + cp -a "$FILE" "$NEW" fi - OBJS+=("${FILE}") - shift done + +# replace *.o with *.rel and *.a with *.lib +# +# On bash this is a simple pattern substituiton: +# set -- "${@/.o/.rel}" +# set -- "${@/.a/.lib}" +# +# Unfortunatly, this does not work with dash or ash. dash does not support +# pattern substituition in general. busybox ash does not support arrays and +# shortens the arg list to the first argument, deleting all the rest. +# +# As a workaround we combine the argument list into a single string. By +# using TAB as a field separator we can even deal with spaces, backspaces +# and colons in file names. + +# use tab as field separator +IFS=$'\t' + + +# combine all arguments into a single string with field separator and add a +# TAB at the end. This allows the pattern below to match the last argument +# as well. +vprint 2 "Combine all arguments into a single string" +line="$* " + +# do the filename replacements: (bash and ash, not dash) +# Needs a double slash to replace all occurencies, not only the first one. +#line=${line//.o/.rel} +#line=${line//.a/.lib} +# replace all the occurencies just before a field separator +vprint 2 "- before substitution: $line" +line="${line//.o /.rel }" +line="${line//.a /.lib }" +vprint 2 "- after substitution: $line" + vprint 1 "cmd: ${ORANGE}$SDCC $line${OFF}" -"$SDCC" "${OBJS[@]}" +"$SDCC" $line # propagate the sdcc exit code exit $? From 2da8bd4a6ec5846fb5fdeb0ce569154c07391065 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 12:03:37 +0100 Subject: [PATCH 08/59] surpress output of expr --- sduino/hardware/sduino/tools/wrapper/sdcc-link.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh index 3c86123d..77470a8f 100755 --- a/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh +++ b/sduino/hardware/sduino/tools/wrapper/sdcc-link.sh @@ -97,7 +97,8 @@ shift vprint 2 "copy *.a to *.lib" for FILE; do vprint 2 "- checking parameter '$FILE'" - if expr "$FILE" : ".*\.a$"; then # bash, dash, busybox ash + # using expr works for bash, dash, busybox ash + if expr "$FILE" : ".*\.a$" > /dev/null; then NEW=${FILE%.a}.lib vprint 1 "copy $FILE to $NEW" cp -a "$FILE" "$NEW" From dba5b800df527065dcd76451ce8e9bcf4cfa21a2 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 14:03:37 +0100 Subject: [PATCH 09/59] use busybox as command shell for executing the wrapper scripts on windows --- sduino/hardware/sduino/stm8/platform.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sduino/hardware/sduino/stm8/platform.txt b/sduino/hardware/sduino/stm8/platform.txt index 4c9a32af..99ef755f 100644 --- a/sduino/hardware/sduino/stm8/platform.txt +++ b/sduino/hardware/sduino/stm8/platform.txt @@ -7,7 +7,7 @@ # https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification name=STM8S Boards -version=0.4.0-pre1 +version=0.4.0 # General folder structure variables # ---------------------------------- @@ -37,7 +37,8 @@ compiler.warning_flags.all=-Wp-Wall -V # Default "compiler.path" is correct, change only if you want to override the initial value compiler.path={runtime.tools.sdcc.path}/bin compiler.wrapper.path={runtime.tools.STM8Tools.path}/wrapper -compiler.wrapper.path.windows={runtime.tools.STM8Tools.path}/win/bash" "{runtime.tools.STM8Tools.path}/wrapper +compiler.wrapper.path.windows={runtime.tools.STM8Tools.path}/win/busybox" +ash "{runtime.tools.STM8Tools.path}/wrapper compiler.tools.path={runtime.tools.avr-gcc.path}/bin compiler.c.cmd=sdcc From 3c6900c35a20e6fff32829735c68513f0f677034 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 10 Dec 2018 14:27:05 +0100 Subject: [PATCH 10/59] add binaries for the windows tools --- CHANGELOG.md | 2 ++ sduino/hardware/sduino/tools/win/busybox.exe | Bin 0 -> 487936 bytes sduino/hardware/sduino/tools/win/stm8flash.exe | Bin 0 -> 46592 bytes sduino/hardware/sduino/tools/win/stm8gal.exe | Bin 0 -> 64512 bytes 4 files changed, 2 insertions(+) create mode 100644 sduino/hardware/sduino/tools/win/busybox.exe create mode 100755 sduino/hardware/sduino/tools/win/stm8flash.exe create mode 100755 sduino/hardware/sduino/tools/win/stm8gal.exe diff --git a/CHANGELOG.md b/CHANGELOG.md index 48f5fd8a..0cf47aeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Changed +- using busybox as command shell for windows to run the wrapper scripts ## [0.4.0 - 2018-12-07] diff --git a/sduino/hardware/sduino/tools/win/busybox.exe b/sduino/hardware/sduino/tools/win/busybox.exe new file mode 100644 index 0000000000000000000000000000000000000000..aab048b0eea0af409d42850f3754dc5bf7c8e432 GIT binary patch literal 487936 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 z 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Ζ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

Q}JG?t_hvQRk9bjE;ea?`2BE0T(J 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ླhtZ;%zel6U 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

sgrGz| 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

;il4ODP_V!+TE! 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≥MxZ;(UW=L}Mao!5A8Y8NQC7kxXMF<+ zLV>u03U3kDI2u>hH?cZ}l=H1+w0<~!HJohZUqd5k6P>H8o1ktr4Maa+brkEWkcV^C zRYP9Y^>rFgGeuh-ZF)=-)ALFf%oW#Emx~3Bm9A>+m!wuYs>)q8&Y5geV=Ce1?Ca37 zWLDVR6$RqD9PN82< zEt@n&%oo90TKb*D?=&$pPwAEh$RI~Y62}Q@K#L=i5ajUb)`ID5!XVNvU9p^o24NEr z?iO2A^;o0U7$u51PDPJHQOgzJJVdsQ2%k4y^?5+Z+cLlhD%XXgVo#OzbyJ+8qmC)Z z!kgxcE9>i>L=$E)2P-`BV}kiGz7gk}6{*LISLx?g%ARe&Y1f@JqNjp(`C#^^Fd;53B2)5ExQK zNZ=MjoZO*QJJ*Xfjx`vUY-wrfIz;K5*FwX(^$pl&qdjAgAg(O0xN}t_+hD=i3}b{J zfvZhhl_rv|hz;0|ZE!X*^{S|^sc&r3HN$*pd4&_(bE2!s!R-E9hHY{*ti{=l4yUWJ z?mD2BwUlP((oK7J9X8~gqY`wgO z_dSyvi}fb2VosEkEJLc^l+HV7B92-bf`~>+&Ohc+<7~z6j6aMC9GXS!0@x`5!x}!Gl4zkt+Lg+5d7e3FGAHdpY6@ zd8?0C(FMUupsoamP#ETpD5ePSuth&3eQGL)uR<(7yqP=KId$+2HRUwQ@X3l!v!cj_ z2gy9jCpAuB zx-@NR(M|Iac25%po}etaUX_1};iiyDET zVK^#k5GgYxK)@cj;SY@=ln$H)VHlQ|JF#ZE(&cmj*Yyr(5xiWf6WWnFRar!hLea?a zmGLtxO~awo&!J$LVf3-N6v*bhs${F%+s0&$04MnX)&u_)IF<7{qv;z8hq;cBhOqMy z+yRM>iq(jZ*jhm}-KfXhYZZL%a@j32vB976BV;l;T4lX_Dh%uL`E?a6&4Ey=ZWY!L zQgw&i7qaQRF#9&BJ8A*y`@{g>ISFqVoaZdKP`q`O3;7|ikt<+?{G#Icf^v+C_a7k7sJPEr zt|DILm5-Nh5BwlsSX4(^UB@*V@>*V7PBZn!R0Q`JyC^bhN}arFnmBpYR8dUD>|srL zO&%T)AQm*Pa@Eo~)XMr=8lPpWD86Za!Q30CYQ;^6M_gE7qzO}M>D=p4CftOmqpGHU zEf##}(2ZR6rdyTxUUJJzF}7aQN_N>nOfbdb6R) z;i{y=xok0y7N-!!u1PW9k{x2y^rfNT$kWA)oHk9;wr%U zl{ncXT#YLm7yT9Dz5v$>Ts64v#`PespWu25*ROHy$MpwXZ{T_d*Za6m;`$s{{M9DG zit935DY&NL%Eomat`b}~;<^Rb?YLIsYQ%LnuKRJd;d%tuPjLMV*A84S;5vZo6#yG^!KIwzL@;Vgd&>d&%uf#wt_baMVJ#g9VJ*@DG>f76gz6LK~sci z4RKQq9WA7|K`G&fR8m%5ac2?M>79b` zLCjpNvmky%WE3ur)Yy3rEOCWr3!7pWxUj!YLJ}U1Wue~!#J}~8SoN(yHV``+gdxR<>egH&zPs^zR9VXLsbf~QUj z%d6;nX@Zb$VyGdCS|JR8_HSeOP<(9~Ft>tJjZ zTP+iWL$Os=HLj-Bf^aytik9GnKgCwDUF9m_&q%qP6~Y^_RivuIQM#l3w_>ZB9F9AM zw_~w|R#PMN##XVTM1t^METmGgy1Y@anrQ+=ZC+x=T5UzcdO^6tEF%^~Ga)9pNtD9U z;5B9#W?hwVt(j&)#3Teh`oH Date: Mon, 10 Dec 2018 14:51:39 +0100 Subject: [PATCH 11/59] fix building the core library using make (fix commit 9e52674a) --- sduino/Arduino.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sduino/Arduino.mk b/sduino/Arduino.mk index fac49f4f..f2793527 100644 --- a/sduino/Arduino.mk +++ b/sduino/Arduino.mk @@ -1481,8 +1481,7 @@ $(TARGET_ELF): $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS) $(CC) $(LDFLAGS) -o $@ $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS) $(OTHER_LIBS) -lc -lm $(LINKER_SCRIPTS) $(CORE_LIB): $(CORE_OBJS) $(LIB_OBJS) $(PLATFORM_LIB_OBJS) $(USER_LIB_OBJS) - $(AR) rcs $@ \ - $(LIB_OBJS) $(PLATFORM_LIB_OBJS) $(USER_LIB_OBJS) + $(AR) rcs $@ $^ error_on_caterina: $(ERROR_ON_CATERINA) From 386607d7cfb6df25cf54f338f049ff64ca5ce74a Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 11 Dec 2018 11:34:49 +0100 Subject: [PATCH 12/59] add script sdsize.sh to display the resource usage similar to the size tool --- .../hardware/sduino/tools/wrapper/sdsize.sh | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 sduino/hardware/sduino/tools/wrapper/sdsize.sh diff --git a/sduino/hardware/sduino/tools/wrapper/sdsize.sh b/sduino/hardware/sduino/tools/wrapper/sdsize.sh new file mode 100755 index 00000000..1e8d244f --- /dev/null +++ b/sduino/hardware/sduino/tools/wrapper/sdsize.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# works on bash, dash or busybox ash + +print_usage () +{ + cat << EOF +Print the memory usage of a binary compiled by SDCC + +usage: $0 mapfile + +The display format mimics the output of the size tool. The values are +calculated from the segment definitions in the map file as follows: + +text (code in flash) + - CODE: program code + - GSINIT: code to copy the globaly initialized data + - GSFINAL: code after the initialization is done + +data (initialized data in flash) + - HOME: Interrupt vectors etc. + - CONST: Constants (tables) + - INITIALIZER: Content of initialized variables (to be copied to + INITIALIZED) + +bss (uninitialized, zeroed and initialized, total RAM usage) + - DATA: uninitialized + - INITIALIZED: initialized, copied from INITIALIZER + +dec (total flash usage in decimal) + - text+data + +hex (total flash usage in hex) + - text+data + +filename + - the filename of the map file + +LGPL-2.1, (c) 2018 M. Mayer +EOF + exit 1 +} + + +VERBOSE=0 + +while getopts ":hv" opt; do + case "$opt" in + v) + echo "verbose!" + VERBOSE=1 + ;; + *) + print_usage + ;; + esac +done +shift $((OPTIND-1)) + +if [ $# -lt 1 ]; then + print_usage; +fi + +FILENAME="$1" + +awk -v filename="$FILENAME" -v verbose=$VERBOSE ' +/^[A-Z]+ / { + if (verbose) print $1, $3, $5; size[$1]=$5; +} +END { + text = size["CODE"]+size["GSINIT"]+size["GSFINAL"]; + data = size["HOME"]+size["CONST"]+size["INITIALIZER"]; + bss = size["DATA"]+size["INITIALIZED"]; + print " text\t data\t bss\t dec\t hex\tfilename"; +# print text, data, bss; + printf "%7d\t%7d\t%7d\t%7d\t%7x\t%s\n", text, data, bss, text+data, text+data, filename; +}' "$FILENAME" From a33a0278de0afcc0aef051802eefde8e00a48525 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 11 Dec 2018 11:49:58 +0100 Subject: [PATCH 13/59] The command line compile process uses busybox on windows systems. Just busybox and a make binary is enough now, no need for a full set of msys2 tools anymore. --- sduino/Arduino.mk | 4 ++++ sduino/sduino.mk | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/sduino/Arduino.mk b/sduino/Arduino.mk index f2793527..1f4dd80e 100644 --- a/sduino/Arduino.mk +++ b/sduino/Arduino.mk @@ -1136,6 +1136,10 @@ ifneq (,$(findstring AVR,$(shell $(SIZE) --help))) # and the elf to get nice output. avr_size = $(SIZE) $(SIZEFLAGS) --format=avr $(1) $(call show_config_info,Size utility: AVR-aware for enhanced output,[AUTODETECTED]) +else ifneq (,$(findstring map,$(shell $(SIZE) --help))) + # We have a script for SDCC. pass it the map file instead of the hex file + avr_size = $(SIZE) $(2:ihx=map) + $(call show_config_info,Size utility: SDCC compatible script,[AUTODETECTED]) else # We have a plain-old binutils version - just give it the hex. avr_size = $(SIZE) $(2) diff --git a/sduino/sduino.mk b/sduino/sduino.mk index 6787b933..efdc6e06 100644 --- a/sduino/sduino.mk +++ b/sduino/sduino.mk @@ -65,8 +65,9 @@ ifeq ($(OS),Windows_NT) # for Windows always assume the tools to be in this dir tree SDCC_PATH := $(ARDUINO_DIR)/hardware/sduino/tools/sdcc/bin endif -# SHELL := $(ARDUINO_DIR)/hardware/sduino/tools/win/dash - SHELL := dash + SHELL := $(ARDUINO_DIR)/hardware/sduino/tools/win/busybox.exe + .SHELLFLAGS=ash -c + SIZE := $(ARDUINO_DIR)/hardware/sduino/tools/wrapper/sdsize.sh # PATH := $(realpath $(ARDUINO_DIR)/hardware/sduino/tools/win):$(PATH) else # Linux (and Mac): expect SDCC to be in /opt/sdcc @@ -81,7 +82,7 @@ OVERRIDE_EXECUTABLES=yes CC = $(SDCC_PATH)/sdcc AS = $(SDCC_PATH)/sdasstm8 AR = $(SDCC_PATH)/sdar - SIZE = /usr/bin/size + SIZE ?= /usr/bin/size ARDUINO_SKETCHBOOK = /tmp # temporarly, to prevent usage of the real libs From 140ed49a8fd0be451bf3b198b3823fafa0e19b55 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 11 Dec 2018 13:35:05 +0100 Subject: [PATCH 14/59] update changelog and install instructions for busybox --- CHANGELOG.md | 3 ++ docs/usage/manual-install.md | 86 +++++++++++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cf47aeb..3743fd51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - using busybox as command shell for windows to run the wrapper scripts +### Fixed +- building the core library when using make (regression bug in 0.4.0) + ## [0.4.0 - 2018-12-07] ### Added diff --git a/docs/usage/manual-install.md b/docs/usage/manual-install.md index 04f9fc27..41aee600 100644 --- a/docs/usage/manual-install.md +++ b/docs/usage/manual-install.md @@ -39,7 +39,7 @@ the hardware folder, if not already present: Extract the downloaded [SDCC archive](http://sdcc.sourceforge.net/snap.php) under `/opt`: -```text +```bash sudo mkdir /opt sudo tar xvjf ~/Downloads/sdcc-snapshot* -C /opt ``` @@ -47,7 +47,7 @@ under `/opt`: Create a link to SDCC from the tools directory of the sduino repository (required for IDE builds): -```text +```bash cd ~/Arduino/hardware/sduino/tools ln -s /opt/sdcc . ``` @@ -59,7 +59,7 @@ tools directory. Create a link `linux` to the linux tools directory that matches your system and copy the binaries to a convient place in your path, e.g. `/usr/local/bin`: -```text +```bash ln -s linux64 linux cp -av linux/* /usr/local/bin ``` @@ -69,7 +69,7 @@ e.g. `/usr/local/bin`: repository for any Linux distribution. Example for Debian-type systems (like Ubuntu, Mint, Elementary etc.): -```text +```bash sudo apt-get install make libusb-1.0-0 ``` @@ -81,10 +81,19 @@ tool. Save this as root in in `/etc/udev/rules.d/99-stlink.rules`: # ST-Link V1, if using a STM8S discovery board # important: It needs a special entry in /etc/modprobe.d - ATTR{idVendor}=="0483", ATTR{idProduct}=="3744", MODE="0666", GROUP="plugdev" + SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", \ + MODE:="0666", \ + SYMLINK+="stlinkv1_%n" # ST-Link/V2, the china adapter with the green plastic housing - ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666", GROUP="plugdev" + SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \ + MODE:="0666", \ + SYMLINK+="stlinkv2_%n" + + # ST-Link/V2.1, the new Nucleo STM8 boards + SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \ + MODE:="0666", \ + SYMLINK+="stlinkv2-1_%n" ``` Using the STM8S-Discovery board as a flash programmer requires a [special @@ -99,7 +108,7 @@ entry](../hardware/stm8sdiscovery#usage-with-linux-and-stm8flash). Quite similar to the Linux install. [Install Homebrew](https://brew.sh/) if you haven't done it yet, than install make and unpack the sdcc snapshot: -```text +```bash brew make mkdir /opt tar xvjf sdcc-snapshot* -C /opt @@ -110,8 +119,7 @@ in your Documents folder at `/Users//Documents/Arduino/hardware`. Not sure about stm8flash, I didn't try it. Have a look at the [stm8flash repository](https://github.com/vdudouyt/stm8flash). It would be great if -someone could summarize the procedure and send it to me together with a -compiled binary for the repository. +someone could summarize the procedure and send it to me. @@ -121,13 +129,51 @@ compiled binary for the repository. ## Windows -Same idea again, but additionally we need to install a minimal MinGW command -line environment with tools needed by make and the Makefile. Let's start +Same idea again, but additionally we need to install a minimal command line +environment with all the tools needed by make and the Makefile. Let's start with that: +### Installing a command line environment + +This can be any of these options (in order of complexity): + +- busybox and make +- Msys2 +- MinGW +- Cygwin + +The makefile `sduino.mk` uses busybox by default when running on Windows. To +change that, set these environment variables accordingly: + + SHELL=bash + .SHELLFLAGS=-c + +Alternativly, it is possible to include these lines in the project `Makefile` +or edit `sduino.mk` directly (lines 68, 69). + + + +#### Install busybox and make + +This is by far the easiest way to get going. busybox already comes with +sduino in the `hardware/sduino/tools/win/` folder. A statically linked copy +of make-4.2 can be found in the +[windowstools](https://github.com/tenbaht/sduino-windowstools) repository. + +Just copy these two binaries into a place somewhere in your `%PATH%`. + + + #### Install Msys2 +Msys2/mingw is more capable than busybox and even comes with a proper +package manager. Install this if you plan on using the command line tools +for more than just running sdunio compilations. + +mingw is a full (cross-) compilation environment and it uses msys2, which is +just a collection of basic UNIX tools. msys2 is enough for using sduino. + - Download and run the installer from [http://www.msys2.org](http://www.msys2.org) - Install make: `pacman -S make` - define the environment variable `HOME` in the windows settings as @@ -139,6 +185,24 @@ Now we can start working. ) +#### Cygwin + +cygwin is similar to msys2, but even more complete in the sense that it +tries to emulate a full POSIX environment. It is really more like a virtual +machine than just a set of libraries. + +Almost anything that compiles for UNIX can be compiled for cygwin with +minimal effort. The downside is that the resulting binaries are linked +against cygwin specific libraries and that they don't mix very well with +Windows native applications. It is possible to do it, but it might require +some extra effort. + +Install this if you need full POSIX compliance. (e.g. compiling +stm8flash with support for espstlink, that requires the POSIX termios +library). + + + #### Install the core files and SDCC Thanks to the running bash the remaining steps are the same as for Linux, From c7ebb07c1ef1b659495cb59c59028a59b75626ac Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Sat, 15 Dec 2018 22:32:35 +0200 Subject: [PATCH 15/59] pull in main.c by defining a dummy variable, simplify Arduino.mk merging main.c into wiring.c works almost always - except for a sketch that doesn't use any Arduino functions like the BareMinimum example. Now define a dummy variable that pulls in a reference to main(). Use $(VAR:old=new) as a more compact alternative to the full ($patsubst %.old,%.new,VAR) syntax in the Arduino.mk makefile to replace a file name suffix. --- sduino/Arduino.mk | 26 ++++------- .../hardware/sduino/stm8/cores/sduino/main.c | 42 ++++++++++++++++++ .../sduino/stm8/cores/sduino/wiring.c | 43 ------------------- 3 files changed, 51 insertions(+), 60 deletions(-) create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/main.c diff --git a/sduino/Arduino.mk b/sduino/Arduino.mk index f2793527..e8585d7d 100644 --- a/sduino/Arduino.mk +++ b/sduino/Arduino.mk @@ -1190,8 +1190,7 @@ $(call show_separator) # library sources $(OBJDIR)/libs/%.c.$(OBJSUFFIX): $(ARDUINO_LIB_PATH)/%.c @$(MKDIR) $(dir $@) - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -# mv $(patsubst %.o,%.rel,$@) $@ + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ # $(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@ $(OBJDIR)/libs/%.cpp.$(OBJSUFFIX): $(ARDUINO_LIB_PATH)/%.cpp @@ -1204,8 +1203,7 @@ $(OBJDIR)/libs/%.S.$(OBJSUFFIX): $(ARDUINO_LIB_PATH)/%.S $(OBJDIR)/platformlibs/%.c.$(OBJSUFFIX): $(ARDUINO_PLATFORM_LIB_PATH)/%.c @$(MKDIR) $(dir $@) - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -# mv $(patsubst %.o,%.rel,$@) $@ + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ # $(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@ $(OBJDIR)/platformlibs/%.cpp.$(OBJSUFFIX): $(ARDUINO_PLATFORM_LIB_PATH)/%.cpp @@ -1222,8 +1220,7 @@ $(OBJDIR)/userlibs/%.cpp.$(OBJSUFFIX): $(USER_LIB_PATH)/%.cpp $(OBJDIR)/userlibs/%.c.$(OBJSUFFIX): $(USER_LIB_PATH)/%.c @$(MKDIR) $(dir $@) - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -# mv $(patsubst %.o,%.rel,$@) $@ + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ # $(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@ $(OBJDIR)/userlibs/%.S.$(OBJSUFFIX): $(USER_LIB_PATH)/%.S @@ -1239,8 +1236,7 @@ endif # normal local sources $(OBJDIR)/%.c.$(OBJSUFFIX): %.c $(COMMON_DEPS) | $(OBJDIR) @$(MKDIR) $(dir $@) - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -# mv $(patsubst %.o,%.rel,$@) $@ + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ # $(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@ $(OBJDIR)/%.cc.$(OBJSUFFIX): %.cc $(COMMON_DEPS) | $(OBJDIR) @@ -1261,16 +1257,13 @@ $(OBJDIR)/%.s.$(OBJSUFFIX): %.s $(COMMON_DEPS) | $(OBJDIR) # the pde -> o file $(OBJDIR)/%.pde.$(OBJSUFFIX): %.pde $(COMMON_DEPS) | $(OBJDIR) - @$(MKDIR) $(dir $@) - (echo '#include \n#line 1 "$<"'; cat $<) > "$(patsubst %.$(OBJSUFFIX),%.c,$@)" - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) "$(patsubst %.$(OBJSUFFIX),%.c,$@)" -o $@ -# $(CXX) -x c++ -include $(ARDUINO_HEADER) -MMD -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ - # the ino -> o file $(OBJDIR)/%.ino.$(OBJSUFFIX): %.ino $(COMMON_DEPS) | $(OBJDIR) @$(MKDIR) $(dir $@) - (echo '#include \n#line 1 "$<"'; cat $<) > "$(patsubst %.$(OBJSUFFIX),%.c,$@)" - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) "$(patsubst %.$(OBJSUFFIX),%.c,$@)" -o $@ + (echo '#include <$(ARDUINO_HEADER)>\n#line 1 "$<"'; \ + echo "void main(void); void (*dummy_variable) () = main;"; \ + cat $<) > "$(@:.$(OBJSUFFIX)=.c)" + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) "$(@:.$(OBJSUFFIX)=.c)" -o $@ # $(CXX) -x c++ -include $(ARDUINO_HEADER) -MMD -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ # generated assembly @@ -1289,8 +1282,7 @@ $(OBJDIR)/%.s: %.cpp $(COMMON_DEPS) | $(OBJDIR) # core files $(OBJDIR)/core/%.c.$(OBJSUFFIX): $(ARDUINO_CORE_PATH)/%.c $(COMMON_DEPS) | $(OBJDIR) @$(MKDIR) $(dir $@) - $(CC) "-Wp-MMD $(patsubst %.$(OBJSUFFIX),%.d,$@)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ -# mv $(patsubst %.o,%.rel,$@) $@ + $(CC) "-Wp-MMD $(@:.$(OBJSUFFIX)=.d)" -c $(CPPFLAGS) $(CFLAGS) $< -o $@ # $(CC) -MMD -c $(CPPFLAGS) $(CFLAGS) $< -o $@ $(OBJDIR)/core/%.cpp.$(OBJSUFFIX): $(ARDUINO_CORE_PATH)/%.cpp $(COMMON_DEPS) | $(OBJDIR) diff --git a/sduino/hardware/sduino/stm8/cores/sduino/main.c b/sduino/hardware/sduino/stm8/cores/sduino/main.c new file mode 100644 index 00000000..f3d0266d --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/main.c @@ -0,0 +1,42 @@ +/* + main.cpp - Main loop for Arduino sketches + Copyright (c) 2005-2013 Arduino Team. All right reserved. + + 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 + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + 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 +*/ + +#include + +// make sure to define prototypes for all used interrupts +//#include "stm8s_it.h" + +unsigned char runSerialEvent; + +int main(void) +{ + init(); + + initVariant(); + + setup(); + + for (;;) { + loop(); + if (runSerialEvent) serialEvent(); + } + +// return 0; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring.c index eb4205da..0f8f9c23 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring.c +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring.c @@ -711,46 +711,3 @@ void init() // work there enableInterrupts(); } - - -/* - main.cpp - Main loop for Arduino sketches - Copyright (c) 2005-2013 Arduino Team. All right reserved. - - 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 - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - 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 -*/ - -//#include - -// make sure to define prototypes for all used interrupts -//#include "stm8s_it.h" - -unsigned char runSerialEvent; - -void main(void) -{ - init(); - - initVariant(); - - setup(); - - for (;;) { - loop(); - if (runSerialEvent) serialEvent(); - } - -// return 0; -} From 91a7d7d5832cf5898c257d997fa1d8026ebe5ad9 Mon Sep 17 00:00:00 2001 From: Adrian Ebeling Date: Sun, 30 Dec 2018 13:40:43 +0100 Subject: [PATCH 16/59] Correctly disable PWM output in digitalWrite() Fixes #72. --- .../sduino/stm8/cores/sduino/wiring_digital.c | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c index 02444ca5..d732c398 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c @@ -54,6 +54,60 @@ const uc_p ccmrx[NUM_TIMERS]={ #endif }; +/** + * CCER register for each timer channel. + * + * Each 8-bit-register can contain the bits for two channels, so in addition to + * the register address itself you also need the individual offset(s) of the + * bit(s) you want to access. + */ +const uc_p ccerx[NUM_TIMERS]={ +#ifdef NEED_TIMER_11_12 + TIM1->CCER1, /* for TIMER11 */ + TIM1->CCER1, /* for TIMER12 */ +#endif + TIM1->CCER2, /* for TIMER13 */ + TIM1->CCER2, /* for TIMER14 */ + TIM2->CCER1, /* for TIMER21 */ + TIM2->CCER1, /* for TIMER22 */ +#ifdef NEED_TIMER_23 + TIM2->CCER2, /* for TIMER23 */ +#endif +#ifdef NEED_TIMER_31_32 + TIM3->CCER1, /* for TIMER31 */ + TIM3->CCER1 /* for TIMER32 */ +#endif +}; + +/** + * These Bits have to be set to 0 in the timer channel's CCER + * (Capture/compare enable register) to disable the output, so that the + * physical pin is not driven by the timer. + * + * @see + * RM0016 Reference Manual + * STM8S Series and STM8AF Series 8-bit microcontrollers + * DocID14587 Rev 14 (Oct 2017) + * Table 38. Output control for complementary OCi and OCiN channels with break + * feature + */ +const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]={ +#ifdef NEED_TIMER_11_12 + (1 << 0) | (1 << 2), /* for TIMER11 */ + (1 << 4) | (1 << 6), /* for TIMER12 */ +#endif + (1 << 0) | (1 << 2), /* for TIMER13 */ + (1 << 4), /* for TIMER14 */ + (1 << 0), /* for TIMER21 */ + (1 << 4), /* for TIMER22 */ +#ifdef NEED_TIMER_23 + (1 << 0), /* for TIMER23 */ +#endif +#ifdef NEED_TIMER_31_32 + (1 << 0), /* for TIMER31 */ + (1 << 4) /* for TIMER32 */ +#endif +}; /* arduino-style pinMode @@ -173,7 +227,13 @@ void pinMode(uint8_t pin, uint8_t mode) */ static void turnOffPWM(uint8_t timer) { - *((unsigned char *) ccmrx[timer-1]) &= ~TIM1_CCMR_OCM; + // Output compare mode = 000: Frozen - The comparison between the output + // compare register TIM1_CCR1 and the counter register TIM1_CNT has no + // effect on the outputs. + *((unsigned char *) ccmrx[timer-1]) &= ~TIM1_CCMR_OCM; + + // CCiE = CCiNE = 0: Output disabled (not driven by the timer) + *((unsigned char *) ccerx[timer-1]) &=~ (DISABLE_TIMER_OUTP_MASK[timer-1]); } From d82a724e0a914998cf1883acc0712f323f36ae1b Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 7 Jan 2019 13:51:45 +0100 Subject: [PATCH 17/59] build pcf2119 examples for mb208 board The pcf2119 library is mostly targeted towards the STM8S208-based muBoard. Building these examples for the mk208 should result in working binaries. --- .../LiquidCrystal_pcf2119/examples/BlinkingCursor/Makefile | 2 +- .../LiquidCrystal_pcf2119/examples/CustomChars/Makefile | 2 +- .../LiquidCrystal_pcf2119/examples/HelloWorld/Makefile | 2 +- .../LiquidCrystal_pcf2119/examples/SerialDisplay/Makefile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/BlinkingCursor/Makefile b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/BlinkingCursor/Makefile index 013ba610..c19d0c85 100644 --- a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/BlinkingCursor/Makefile +++ b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/BlinkingCursor/Makefile @@ -1,3 +1,3 @@ -BOARD_TAG = stm8sblue +BOARD_TAG = mb208 include ../../../../../../../sduino.mk diff --git a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/CustomChars/Makefile b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/CustomChars/Makefile index 013ba610..c19d0c85 100644 --- a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/CustomChars/Makefile +++ b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/CustomChars/Makefile @@ -1,3 +1,3 @@ -BOARD_TAG = stm8sblue +BOARD_TAG = mb208 include ../../../../../../../sduino.mk diff --git a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/HelloWorld/Makefile b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/HelloWorld/Makefile index 013ba610..c19d0c85 100644 --- a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/HelloWorld/Makefile +++ b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/HelloWorld/Makefile @@ -1,3 +1,3 @@ -BOARD_TAG = stm8sblue +BOARD_TAG = mb208 include ../../../../../../../sduino.mk diff --git a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/SerialDisplay/Makefile b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/SerialDisplay/Makefile index 013ba610..c19d0c85 100644 --- a/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/SerialDisplay/Makefile +++ b/sduino/hardware/sduino/stm8/libraries/LiquidCrystal_pcf2119/examples/SerialDisplay/Makefile @@ -1,3 +1,3 @@ -BOARD_TAG = stm8sblue +BOARD_TAG = mb208 include ../../../../../../../sduino.mk From a5adacdb7dfe88b9bc4a1f8e564ceed2e2099b9c Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 10:52:50 +0100 Subject: [PATCH 18/59] add a basic regression test script --- .gitignore | 2 + test/logs/test-v0.4.0-11-g87f15d6.log | 139 ++++++++++++++++++++++++++ test/logs/test-v0.4.0-12-gc7ebb07.log | 139 ++++++++++++++++++++++++++ test/make-test.sh | 67 +++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 test/logs/test-v0.4.0-11-g87f15d6.log create mode 100644 test/logs/test-v0.4.0-12-gc7ebb07.log create mode 100755 test/make-test.sh diff --git a/.gitignore b/.gitignore index a00ee231..c86dfc6a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ tags *.map # ignore files generated by the Arduino make system: build-*/ +# ignore test log files: +*test.log # ignore files generated by patch: *.orig *.rej diff --git a/test/logs/test-v0.4.0-11-g87f15d6.log b/test/logs/test-v0.4.0-11-g87f15d6.log new file mode 100644 index 00000000..40211172 --- /dev/null +++ b/test/logs/test-v0.4.0-11-g87f15d6.log @@ -0,0 +1,139 @@ +compile log for all tests. +source revision: v0.4.0-11-g87f15d6 +2 EEPROM/examples/eeprom_clear + 514 100 0 614 266 build-stm8sblue/eeprom_clear.map +0 EEPROM/examples/eeprom_crc + 2881 238 70 3119 c2f build-stm8sblue/eeprom_crc.map +0 EEPROM/examples/eeprom_get + 5757 195 70 5952 1740 build-stm8sblue/eeprom_get.map +2 EEPROM/examples/eeprom_iteration + 85 0 0 85 55 build-stm8sblue/eeprom_iteration.map +0 EEPROM/examples/eeprom_put + 2852 253 70 3105 c21 build-stm8sblue/eeprom_put.map +0 EEPROM/examples/eeprom_read + 2693 129 73 2822 b06 build-stm8sblue/eeprom_read.map +0 EEPROM/examples/eeprom_update + 2756 227 72 2983 ba7 build-stm8sblue/eeprom_update.map +0 EEPROM/examples/eeprom_write + 2740 227 72 2967 b97 build-stm8sblue/eeprom_write.map +0 EEPROM/examples/test + 2815 134 74 2949 b85 build-stm8sblue/test.map +0 Generic_Examples/examples/01.Basics/AnalogReadSerial + 3346 225 70 3571 df3 build-stm8sblue/AnalogReadSerial.map +2 Generic_Examples/examples/01.Basics/BareMinimum + 2 0 0 2 2 build-stm8sblue/BareMinimum.map +0 Generic_Examples/examples/01.Basics/Blink + 2370 225 70 2595 a23 build-stm8sblue/Blink.map +0 Generic_Examples/examples/01.Basics/DigitalReadSerial + 3061 227 72 3288 cd8 build-stm8sblue/DigitalReadSerial.map +0 Generic_Examples/examples/01.Basics/Fade + 2686 231 76 2917 b65 build-stm8sblue/Fade.map +0 Generic_Examples/examples/01.Basics/ReadAnalogVoltage + 6300 237 70 6537 1989 build-stm8sblue/ReadAnalogVoltage.map +0 Generic_Examples/examples/02.Digital/BlinkWithoutDelay + 2431 237 76 2668 a6c build-stm8sblue/BlinkWithoutDelay.map +2 Generic_Examples/examples/02.Digital/Button + 492 106 2 598 256 build-stm8sblue/Button.map +0 Generic_Examples/examples/02.Digital/Debounce + 2475 241 84 2716 a9c build-stm8sblue/Debounce.map +0 Generic_Examples/examples/02.Digital/DigitalInputPullup + 3087 225 70 3312 cf0 build-stm8sblue/DigitalInputPullup.map +0 Generic_Examples/examples/02.Digital/StateChangeDetection + 3212 269 76 3481 d99 build-stm8sblue/StateChangeDetection.map +0 Generic_Examples/examples/03.Analog/AnalogInOutSerial + 3935 259 78 4194 1062 build-stm8sblue/AnalogInOutSerial.map +0 Generic_Examples/examples/03.Analog/AnalogInput + 2699 231 76 2930 b72 build-stm8sblue/AnalogInput.map +0 Generic_Examples/examples/03.Analog/Calibration + 3423 239 80 3662 e4e build-stm8sblue/Calibration.map +0 Generic_Examples/examples/03.Analog/Fading + 2692 227 72 2919 b67 build-stm8sblue/Fading.map +0 Generic_Examples/examples/03.Analog/Smoothing + 3462 233 98 3695 e6f build-stm8sblue/Smoothing.map +0 Generic_Examples/examples/04.Communication/ASCIITable + 2775 187 72 2962 b92 build-stm8sblue/ASCIITable.map +0 Generic_Examples/examples/04.Communication/Dimmer + 2667 227 70 2894 b4e build-stm8sblue/Dimmer.map +0 Generic_Examples/examples/04.Communication/Graph + 3346 225 70 3571 df3 build-stm8sblue/Graph.map +0 Generic_Examples/examples/04.Communication/SerialCallResponseASCII + 4014 245 82 4259 10a3 build-stm8sblue/SerialCallResponseASCII.map +0 Generic_Examples/examples/04.Communication/SerialCallResponse + 3422 237 82 3659 e4b build-stm8sblue/SerialCallResponse.map +0 Generic_Examples/examples/06.Sensors/Ping + 3581 235 70 3816 ee8 build-stm8sblue/Ping.map +2 Generic_Examples/examples/07.Display/barGraph + 1697 128 24 1825 721 build-stm8sblue/barGraph.map +0 I2C/examples/busscan + 4525 353 108 4878 130e build-stm8sblue/busscan.map +0 I2C/examples/pcf8574 + 4715 322 111 5037 13ad build-stm8sblue/pcf8574.map +0 LiquidCrystal/examples/Autoscroll + 4143 225 91 4368 1110 build-stm8sblue/Autoscroll.map +0 LiquidCrystal/examples/Blink + 4055 239 91 4294 10c6 build-stm8sblue/Blink.map +0 LiquidCrystal/examples/Cursor + 4055 239 91 4294 10c6 build-stm8sblue/Cursor.map +0 LiquidCrystal/examples/CustomCharacter + 4990 283 135 5273 1499 build-stm8sblue/CustomCharacter.map +0 LiquidCrystal/examples/Display + 4055 239 91 4294 10c6 build-stm8sblue/Display.map +0 LiquidCrystal/examples/HelloWorld + 4067 239 91 4306 10d2 build-stm8sblue/HelloWorld.map +0 LiquidCrystal/examples/Scroll + 4130 239 91 4369 1111 build-stm8sblue/Scroll.map +0 LiquidCrystal/examples/SerialDisplay + 3386 225 91 3611 e1b build-stm8sblue/SerialDisplay.map +0 LiquidCrystal/examples/setCursor + 3440 229 91 3669 e55 build-stm8sblue/setCursor.map +0 LiquidCrystal/examples/TextDirection + 3401 227 93 3628 e2c build-stm8sblue/TextDirection.map +0 LiquidCrystal_I2C/doc/LiquidCrystal_I2C/examples/HelloWorld +0 LiquidCrystal_I2C/examples/BlinkingCursor + 5279 316 121 5595 15db build-stm8sblue/BlinkingCursor.map +0 LiquidCrystal_I2C/examples/CustomChars + 5502 394 185 5896 1708 build-stm8sblue/CustomChars.map +0 LiquidCrystal_I2C/examples/HelloWorld + 5264 301 121 5565 15bd build-stm8sblue/HelloWorld.map +0 LiquidCrystal_I2C/examples/SerialDisplay + 5263 287 121 5550 15ae build-stm8sblue/SerialDisplay.map +0 LiquidCrystal_I2C/examples/test + 5230 301 121 5531 159b build-stm8sblue/test.map +0 LiquidCrystal_pcf2119/examples/BlinkingCursor + 5785 604 122 6389 18f5 build-mb208/BlinkingCursor.map +0 LiquidCrystal_pcf2119/examples/CustomChars + 6004 682 186 6686 1a1e build-mb208/CustomChars.map +0 LiquidCrystal_pcf2119/examples/HelloWorld + 5726 589 122 6315 18ab build-mb208/HelloWorld.map +0 LiquidCrystal_pcf2119/examples/SerialDisplay + 5833 575 122 6408 1908 build-mb208/SerialDisplay.map +0 Mini_SSD1306/examples/oled-mini + 5814 1411 1140 7225 1c39 build-stm8sblue/oled-mini.map +0 PCD8544/examples/HelloWorld + 4822 724 146 5546 15aa build-stm8sblue/HelloWorld.map +0 PCD8544/examples/Thermometer + 5866 748 149 6614 19d6 build-stm8sblue/Thermometer.map +0 Servo/examples/Knob + 4661 232 143 4893 131d build-stm8sblue/Knob.map +0 Servo/examples/Sweep + 4368 232 141 4600 11f8 build-stm8sblue/Sweep.map +0 Stepper/examples/MotorKnob + 4339 245 90 4584 11e8 build-stm8sblue/MotorKnob.map +0 Stepper/examples/stepper_oneRevolution + 4778 270 88 5048 13b8 build-stm8sblue/stepper_oneRevolution.map +0 Stepper/examples/stepper_oneStepAtATime + 4755 252 90 5007 138f build-stm8sblue/stepper_oneStepAtATime.map +0 Stepper/examples/stepper_speedControl + 4918 249 94 5167 142f build-stm8sblue/stepper_speedControl.map +0 Wire/examples/digital_potentiometer + 3481 132 257 3613 e1d build-stm8sblue/digital_potentiometer.map +0 Wire/examples/i2c_scanner + 4377 249 256 4626 1212 build-stm8sblue/i2c_scanner.map +0 Wire/examples/master_reader + 3479 131 256 3610 e1a build-stm8sblue/master_reader.map +0 Wire/examples/master_writer + 3473 138 257 3611 e1b build-stm8sblue/master_writer.map +0 Wire/examples/pcf8574 + 4419 166 259 4585 11e9 build-stm8sblue/pcf8574.map +0 Wire/examples/SFRRanger_reader + 4252 133 258 4385 1121 build-stm8sblue/SFRRanger_reader.map diff --git a/test/logs/test-v0.4.0-12-gc7ebb07.log b/test/logs/test-v0.4.0-12-gc7ebb07.log new file mode 100644 index 00000000..28dc63fa --- /dev/null +++ b/test/logs/test-v0.4.0-12-gc7ebb07.log @@ -0,0 +1,139 @@ +compile log for all tests. +source revision: v0.4.0-12-gc7ebb07 +0 EEPROM/examples/eeprom_clear + 2406 227 72 2633 a49 build-stm8sblue/eeprom_clear.map +0 EEPROM/examples/eeprom_crc + 2881 240 72 3121 c31 build-stm8sblue/eeprom_crc.map +0 EEPROM/examples/eeprom_get + 5757 197 72 5954 1742 build-stm8sblue/eeprom_get.map +0 EEPROM/examples/eeprom_iteration + 1977 127 72 2104 838 build-stm8sblue/eeprom_iteration.map +0 EEPROM/examples/eeprom_put + 2852 255 72 3107 c23 build-stm8sblue/eeprom_put.map +0 EEPROM/examples/eeprom_read + 2693 131 75 2824 b08 build-stm8sblue/eeprom_read.map +0 EEPROM/examples/eeprom_update + 2756 229 74 2985 ba9 build-stm8sblue/eeprom_update.map +0 EEPROM/examples/eeprom_write + 2740 229 74 2969 b99 build-stm8sblue/eeprom_write.map +0 EEPROM/examples/test + 2815 136 76 2951 b87 build-stm8sblue/test.map +0 Generic_Examples/examples/01.Basics/AnalogReadSerial + 3346 227 72 3573 df5 build-stm8sblue/AnalogReadSerial.map +0 Generic_Examples/examples/01.Basics/BareMinimum + 1894 127 72 2021 7e5 build-stm8sblue/BareMinimum.map +0 Generic_Examples/examples/01.Basics/Blink + 2370 227 72 2597 a25 build-stm8sblue/Blink.map +0 Generic_Examples/examples/01.Basics/DigitalReadSerial + 3061 229 74 3290 cda build-stm8sblue/DigitalReadSerial.map +0 Generic_Examples/examples/01.Basics/Fade + 2686 233 78 2919 b67 build-stm8sblue/Fade.map +0 Generic_Examples/examples/01.Basics/ReadAnalogVoltage + 6300 239 72 6539 198b build-stm8sblue/ReadAnalogVoltage.map +0 Generic_Examples/examples/02.Digital/BlinkWithoutDelay + 2431 239 78 2670 a6e build-stm8sblue/BlinkWithoutDelay.map +0 Generic_Examples/examples/02.Digital/Button + 2384 233 74 2617 a39 build-stm8sblue/Button.map +0 Generic_Examples/examples/02.Digital/Debounce + 2475 243 86 2718 a9e build-stm8sblue/Debounce.map +0 Generic_Examples/examples/02.Digital/DigitalInputPullup + 3087 227 72 3314 cf2 build-stm8sblue/DigitalInputPullup.map +0 Generic_Examples/examples/02.Digital/StateChangeDetection + 3212 271 78 3483 d9b build-stm8sblue/StateChangeDetection.map +0 Generic_Examples/examples/03.Analog/AnalogInOutSerial + 3935 261 80 4196 1064 build-stm8sblue/AnalogInOutSerial.map +0 Generic_Examples/examples/03.Analog/AnalogInput + 2699 233 78 2932 b74 build-stm8sblue/AnalogInput.map +0 Generic_Examples/examples/03.Analog/Calibration + 3423 241 82 3664 e50 build-stm8sblue/Calibration.map +0 Generic_Examples/examples/03.Analog/Fading + 2692 229 74 2921 b69 build-stm8sblue/Fading.map +0 Generic_Examples/examples/03.Analog/Smoothing + 3462 235 100 3697 e71 build-stm8sblue/Smoothing.map +0 Generic_Examples/examples/04.Communication/ASCIITable + 2775 189 74 2964 b94 build-stm8sblue/ASCIITable.map +0 Generic_Examples/examples/04.Communication/Dimmer + 2667 229 72 2896 b50 build-stm8sblue/Dimmer.map +0 Generic_Examples/examples/04.Communication/Graph + 3346 227 72 3573 df5 build-stm8sblue/Graph.map +0 Generic_Examples/examples/04.Communication/SerialCallResponseASCII + 4014 247 84 4261 10a5 build-stm8sblue/SerialCallResponseASCII.map +0 Generic_Examples/examples/04.Communication/SerialCallResponse + 3422 239 84 3661 e4d build-stm8sblue/SerialCallResponse.map +0 Generic_Examples/examples/06.Sensors/Ping + 3581 237 72 3818 eea build-stm8sblue/Ping.map +0 Generic_Examples/examples/07.Display/barGraph + 3375 255 96 3630 e2e build-stm8sblue/barGraph.map +0 I2C/examples/busscan + 4525 355 110 4880 1310 build-stm8sblue/busscan.map +0 I2C/examples/pcf8574 + 4715 324 113 5039 13af build-stm8sblue/pcf8574.map +0 LiquidCrystal/examples/Autoscroll + 4143 227 93 4370 1112 build-stm8sblue/Autoscroll.map +0 LiquidCrystal/examples/Blink + 4055 241 93 4296 10c8 build-stm8sblue/Blink.map +0 LiquidCrystal/examples/Cursor + 4055 241 93 4296 10c8 build-stm8sblue/Cursor.map +0 LiquidCrystal/examples/CustomCharacter + 4990 285 137 5275 149b build-stm8sblue/CustomCharacter.map +0 LiquidCrystal/examples/Display + 4055 241 93 4296 10c8 build-stm8sblue/Display.map +0 LiquidCrystal/examples/HelloWorld + 4067 241 93 4308 10d4 build-stm8sblue/HelloWorld.map +0 LiquidCrystal/examples/Scroll + 4130 241 93 4371 1113 build-stm8sblue/Scroll.map +0 LiquidCrystal/examples/SerialDisplay + 3386 227 93 3613 e1d build-stm8sblue/SerialDisplay.map +0 LiquidCrystal/examples/setCursor + 3440 231 93 3671 e57 build-stm8sblue/setCursor.map +0 LiquidCrystal/examples/TextDirection + 3401 229 95 3630 e2e build-stm8sblue/TextDirection.map +0 LiquidCrystal_I2C/doc/LiquidCrystal_I2C/examples/HelloWorld +0 LiquidCrystal_I2C/examples/BlinkingCursor + 5279 318 123 5597 15dd build-stm8sblue/BlinkingCursor.map +0 LiquidCrystal_I2C/examples/CustomChars + 5502 396 187 5898 170a build-stm8sblue/CustomChars.map +0 LiquidCrystal_I2C/examples/HelloWorld + 5264 303 123 5567 15bf build-stm8sblue/HelloWorld.map +0 LiquidCrystal_I2C/examples/SerialDisplay + 5263 289 123 5552 15b0 build-stm8sblue/SerialDisplay.map +2 LiquidCrystal_pcf2119/examples/BlinkingCursor +2 LiquidCrystal_pcf2119/examples/CustomChars +2 LiquidCrystal_pcf2119/examples/HelloWorld +2 LiquidCrystal_pcf2119/examples/SerialDisplay +0 Mini_SSD1306/examples/oled-mini + 5814 1413 1142 7227 1c3b build-stm8sblue/oled-mini.map +0 PCD8544/examples/HelloWorld + 4822 726 148 5548 15ac build-stm8sblue/HelloWorld.map +0 PCD8544/examples/Thermometer + 5866 750 151 6616 19d8 build-stm8sblue/Thermometer.map +0 Servo/examples/Knob + 4661 234 145 4895 131f build-stm8sblue/Knob.map +0 Servo/examples/Sweep + 4368 234 143 4602 11fa build-stm8sblue/Sweep.map +0 Stepper/examples/MotorKnob + 4339 247 92 4586 11ea build-stm8sblue/MotorKnob.map +0 Stepper/examples/stepper_oneRevolution + 4778 272 90 5050 13ba build-stm8sblue/stepper_oneRevolution.map +0 Stepper/examples/stepper_oneStepAtATime + 4755 254 92 5009 1391 build-stm8sblue/stepper_oneStepAtATime.map +0 Stepper/examples/stepper_speedControl + 4918 251 96 5169 1431 build-stm8sblue/stepper_speedControl.map +0 Wire/examples/digital_potentiometer + 3481 134 259 3615 e1f build-stm8sblue/digital_potentiometer.map +0 Wire/examples/i2c_scanner + 4377 251 258 4628 1214 build-stm8sblue/i2c_scanner.map +0 Wire/examples/master_reader + 3479 133 258 3612 e1c build-stm8sblue/master_reader.map +0 Wire/examples/master_writer + 3473 140 259 3613 e1d build-stm8sblue/master_writer.map +0 Wire/examples/pcf8574 + 4419 168 261 4587 11eb build-stm8sblue/pcf8574.map +0 Wire/examples/SFRRanger_reader + 4252 135 260 4387 1123 build-stm8sblue/SFRRanger_reader.map +total text/data/bss/flash (text+data): 237586 16819 7864 254405 +Failed tests: +2 LiquidCrystal_pcf2119/examples/BlinkingCursor +2 LiquidCrystal_pcf2119/examples/CustomChars +2 LiquidCrystal_pcf2119/examples/HelloWorld +2 LiquidCrystal_pcf2119/examples/SerialDisplay diff --git a/test/make-test.sh b/test/make-test.sh new file mode 100755 index 00000000..c3c494c7 --- /dev/null +++ b/test/make-test.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +CURDIR=$(pwd) +SRCREV=$(git describe --tags --match="v*") +LOGFILE=${CURDIR}/logs/test-${SRCREV}.log +BASEDIR=../sduino/hardware/sduino/stm8/libraries/ + +# count the number of CPUs and use them for parallel compiling +THREADS=$(grep processor /proc/cpuinfo |wc -l) + +# make sure $COLUMNS is set +shopt -s checkwinsize + +print_status() { + local status + if [ $1 -eq 0 ]; then + status="\e[32m ok \e[0m" + else + status="\e[31mfail\e[0m" + fi + + # Get the number of columns, but subtact 8 to leave space for the status. + local columns=$((COLUMNS-8)) + echo -e "\r\e[${columns}C[${status}]" +} + + +( + echo "compile log for all tests." + echo "source revision: $SRCREV" +) | tee "$LOGFILE" + +# removing *all* old build directories for a clear start +find "$BASEDIR" -name "build-*" -type d|xargs rm -r + +#find "$BASEDIR" -name Makefile|sort|while read line; do +for line in $(find "$BASEDIR" -name Makefile|sort); do + dir=$(dirname $line) + shortdir=${dir#$BASEDIR} + echo -n "$shortdir" + cd $dir + make -j$THREADS > build-test.log 2>&1 + status=$? +# echo $status + print_status $status + echo "$status $shortdir" >> "$LOGFILE" + if [ $status -eq 0 ]; then + sdsize.sh build-*/*.map|tail -1 >> "$LOGFILE" + fi + cd - > /dev/null +done + + +# output some statistics +( +# sum up the total memory usage + TOTAL=$(awk '/^ / { + text+=$1; data+=$2; bss+=$3 + } + END { + printf "total text/data/bss/flash (text+data):\t%i\t%i\t%i\t%i\n",text,data,bss,text+data + }' "$LOGFILE") + echo $TOTAL + + echo "Failed tests:" + grep "^[1-9]" "$LOGFILE" +) | tee -a "$LOGFILE" From 960bfb0d4aacd4277a70d30ad063cd86eeca9db8 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 11 Dec 2018 11:34:49 +0100 Subject: [PATCH 19/59] add script sdsize.sh to display the resource usage similar to the size tool --- .../hardware/sduino/tools/wrapper/sdsize.sh | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 sduino/hardware/sduino/tools/wrapper/sdsize.sh diff --git a/sduino/hardware/sduino/tools/wrapper/sdsize.sh b/sduino/hardware/sduino/tools/wrapper/sdsize.sh new file mode 100755 index 00000000..1e8d244f --- /dev/null +++ b/sduino/hardware/sduino/tools/wrapper/sdsize.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# works on bash, dash or busybox ash + +print_usage () +{ + cat << EOF +Print the memory usage of a binary compiled by SDCC + +usage: $0 mapfile + +The display format mimics the output of the size tool. The values are +calculated from the segment definitions in the map file as follows: + +text (code in flash) + - CODE: program code + - GSINIT: code to copy the globaly initialized data + - GSFINAL: code after the initialization is done + +data (initialized data in flash) + - HOME: Interrupt vectors etc. + - CONST: Constants (tables) + - INITIALIZER: Content of initialized variables (to be copied to + INITIALIZED) + +bss (uninitialized, zeroed and initialized, total RAM usage) + - DATA: uninitialized + - INITIALIZED: initialized, copied from INITIALIZER + +dec (total flash usage in decimal) + - text+data + +hex (total flash usage in hex) + - text+data + +filename + - the filename of the map file + +LGPL-2.1, (c) 2018 M. Mayer +EOF + exit 1 +} + + +VERBOSE=0 + +while getopts ":hv" opt; do + case "$opt" in + v) + echo "verbose!" + VERBOSE=1 + ;; + *) + print_usage + ;; + esac +done +shift $((OPTIND-1)) + +if [ $# -lt 1 ]; then + print_usage; +fi + +FILENAME="$1" + +awk -v filename="$FILENAME" -v verbose=$VERBOSE ' +/^[A-Z]+ / { + if (verbose) print $1, $3, $5; size[$1]=$5; +} +END { + text = size["CODE"]+size["GSINIT"]+size["GSFINAL"]; + data = size["HOME"]+size["CONST"]+size["INITIALIZER"]; + bss = size["DATA"]+size["INITIALIZED"]; + print " text\t data\t bss\t dec\t hex\tfilename"; +# print text, data, bss; + printf "%7d\t%7d\t%7d\t%7d\t%7x\t%s\n", text, data, bss, text+data, text+data, filename; +}' "$FILENAME" From 6d0fbd348d382696ab1774ee8a36ea9557022ffd Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 12:20:08 +0100 Subject: [PATCH 20/59] emit a warning if committed changes are present in the current source tree --- CHANGELOG.md | 3 +++ test/make-test.sh | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3743fd51..5f1c9897 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Added +- a simple regression test script test/make-test.sh to compile all examples + ### Changed - using busybox as command shell for windows to run the wrapper scripts diff --git a/test/make-test.sh b/test/make-test.sh index c3c494c7..d34b5991 100755 --- a/test/make-test.sh +++ b/test/make-test.sh @@ -1,7 +1,7 @@ #!/bin/bash CURDIR=$(pwd) -SRCREV=$(git describe --tags --match="v*") +SRCREV=$(git describe --tags --match="v*" --dirty) LOGFILE=${CURDIR}/logs/test-${SRCREV}.log BASEDIR=../sduino/hardware/sduino/stm8/libraries/ @@ -10,6 +10,7 @@ THREADS=$(grep processor /proc/cpuinfo |wc -l) # make sure $COLUMNS is set shopt -s checkwinsize +USE_COLOR=1 print_status() { local status @@ -30,6 +31,35 @@ print_status() { echo "source revision: $SRCREV" ) | tee "$LOGFILE" + +if [ $USE_COLOR -gt 0 ]; then +# ANSI color codes to beautify the output: +BLACK='\033[0;30m' +RED='\033[0;31m' +GREEN='\033[0;32m' +ORANGE='\033[0;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +LGRAY='\033[0;37m' +DGRAY='\033[1;30m' +LRED='\033[1;31m' +LGREEN='\033[1;32m' +YELLOW='\033[1;33m' +LBLUE='\033[1;34m' +LPURPLE='\033[1;35m' +LCYAN='\033[1;36m' +WHITE='\033[1;37m' +OFF='\033[0m' +fi + +# check for a clean repository state +if [[ "$SRCREV" = *-dirty ]]; then + echo -e "${ORANGE}Warning:${OFF}"\ + "Uncommitted changes in the working tree. No clean repository state." +fi + + # removing *all* old build directories for a clear start find "$BASEDIR" -name "build-*" -type d|xargs rm -r From c38409c9e78b31183388e7a0207b092493201ed4 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Mon, 7 Jan 2019 13:44:23 +0100 Subject: [PATCH 21/59] split wiring.c --- .../cores/sduino/wiring-alternate-function.c | 51 ++ .../cores/sduino/wiring-delay-microseconds.c | 199 +++++ .../sduino/stm8/cores/sduino/wiring-delay.c | 30 + .../sduino/stm8/cores/sduino/wiring-header.h | 76 ++ .../sduino/stm8/cores/sduino/wiring-init.c | 271 +++++++ .../sduino/stm8/cores/sduino/wiring-micros.c | 52 ++ .../sduino/stm8/cores/sduino/wiring-millis.c | 50 ++ .../sduino/stm8/cores/sduino/wiring.c | 713 ------------------ 8 files changed, 729 insertions(+), 713 deletions(-) create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-alternate-function.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-delay-microseconds.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-delay.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-header.h create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-init.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-micros.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring-millis.c delete mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring.c diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-alternate-function.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-alternate-function.c new file mode 100644 index 00000000..b4a0a1e1 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-alternate-function.c @@ -0,0 +1,51 @@ +#include "wiring-header.h" + +/** + * Helper function for STM8: Switch to the alternate pin functions + * + * a) flexible function: supports switching diffent AFR bits for + * multiple set of pins. Not needed for stm8s103, but might be useful + * for bigger parts. + */ +#ifdef SUPPORT_ALTERNATE_MAPPINGS +/* +void alternateFunction(uint8_t pin, uint8_t val) +{ + uint16_t optionbyte; + uint8_t afr; + + afr = digitalPinToAFR(pin); + if (afr>7) return; // ignore request on invalid pin + + optionbyte = FLASH_ReadOptionByte(OPT->OPT2); + + // flip the bit if the current state differs from requested state + if ( ((optionbyte & (1<OPT2, (optionbyte&0xff)^(1<> 8; +// optionbyte = FLASH_ReadOptionByte(OPT->OPT2) >> 8; + + // flip the bit if the current state differs from requested state + if ( (optionbyte & (1<<0) == 0) ^ (val==0) ) { + FLASH_Unlock(FLASH_MEMTYPE_DATA); +// FLASH_ProgramOptionByte(OPT->OPT2, (optionbyte&0xff)^(1<<0)); + FLASH_ProgramOptionByte(0x4803, optionbyte^(1<<0)); + FLASH_Lock(FLASH_MEMTYPE_DATA); + } +} +#endif + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay-microseconds.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay-microseconds.c new file mode 100644 index 00000000..ec7061a9 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay-microseconds.c @@ -0,0 +1,199 @@ +#include "wiring-header.h" + +/** + * Delay for the given number of microseconds. + * + * Assumes a 1, 8, 12, 16, 20 or 24 MHz clock. + */ +void delayMicroseconds(unsigned int us) +{ + uint32_t start = micros(); + + // wait until time [us] has passed + while (micros() - start < us) + nop(); + +/* + // call = 4 cycles, return = 4 cycles, arg access = ? cycles +// while (us--); + +#if F_CPU <= 1000000UL +#warning "1m" + us <<= 3; // adjust loop counter for low clock rates +# define LOG_CLOCK (F_CPU*8) +#elsif F_CPU <= 2000000UL +#warning "2m" + us <<= 2; // adjust loop counter for low clock rates +# define LOG_CLOCK 8000000UL //(F_CPU*4) +#elsif F_CPU <= 4000000UL +#warning "3m" + us <<= 1; // adjust loop counter for low clock rates +# define LOG_CLOCK (F_CPU*2) +#else +#warning "else" +# define LOG_CLOCK (F_CPU * 1) +//# define LOG_CLOCK 16000000UL +#endif + + // 13 + (7+nop)*us + unsigned int i; + for (i=us; i; i--) { +#if LOG_CLOCK >=7500000UL + __asm__("nop"); // 7.5..8.5MHz -> 8 cyc/loop +#endif +#if LOG_CLOCK >=8500000UL + __asm__("nop"); // 8.5..9.5MHz -> 9 cyc/loop +#endif +#if LOG_CLOCK >=9500000UL + __asm__("nop"); // 9.5..10.5MHz -> 10 cyc/loop +#endif +#if LOG_CLOCK >=10500000UL + __asm__("nop"); // 10.5..11.5MHz -> 11 cyc/loop +#endif +#if LOG_CLOCK >=11500000UL + __asm__("nop"); // 11.5..12.5MHz -> 12 cyc/loop +#endif + } + + // 25 Grundbedarf incl. call/ret, 7 pro einfachen Schleifendurchlauf + // => t= 25 + 7*us bzs. 25 + 14*us +#if F_CPU >=10000000UL +// for (i=us; i; i--); +#endif +*/ +/*FIXME: Zeitdauer nicht ausgezählt. Das kommt raus: + + 283 ; wiring.c: 124: while (us--);// __asm__ ("nop"); + 00818B 16 03 [ 2] 284 ldw y, (0x03, sp) + 00818D 285 00101$: + 00818D 93 [ 1] 286 ldw x, y + 00818E 90 5A [ 2] 287 decw y + 008190 5D [ 2] 288 tnzw x + 008191 26 FA [ 1] 289 jrne 00101$ + 008193 81 [ 4] 290 ret + + Aufruf und Test: 10 + 6 für 0. Durchlauf = 16 + Pro Durchlauf: 6 +*/ +#if 0 +//FIXME + // call = 4 cycles + 2 to 4 cycles to init us(2 for constant delay, 4 for variable) + + // calling avrlib's delay_us() function with low values (e.g. 1 or + // 2 microseconds) gives delays longer than desired. + //delay_us(us); +#if F_CPU >= 24000000L + // for the 24 MHz clock for the aventurous ones, trying to overclock + + // zero delay fix + if (!us) return; // = 3 cycles, (4 when true) + + // the following loop takes a 1/6 of a microsecond (4 cycles) + // per iteration, so execute it six times for each microsecond of + // delay requested. + us *= 6; // x6 us, = 7 cycles + + // account for the time taken in the preceeding commands. + // we just burned 22 (24) cycles above, remove 5, (5*4=20) + // us is at least 6 so we can substract 5 + us -= 5; //=2 cycles + +#elif F_CPU >= 20000000L + // for the 20 MHz clock on rare Arduino boards + + // for a one-microsecond delay, simply return. the overhead + // of the function call takes 18 (20) cycles, which is 1us + __asm__ __volatile__ ( + "nop" "\n\t" + "nop" "\n\t" + "nop" "\n\t" + "nop"); //just waiting 4 cycles + if (us <= 1) return; // = 3 cycles, (4 when true) + + // the following loop takes a 1/5 of a microsecond (4 cycles) + // per iteration, so execute it five times for each microsecond of + // delay requested. + us = (us << 2) + us; // x5 us, = 7 cycles + + // account for the time taken in the preceeding commands. + // we just burned 26 (28) cycles above, remove 7, (7*4=28) + // us is at least 10 so we can substract 7 + us -= 7; // 2 cycles + +#elif F_CPU >= 16000000L + // for the 16 MHz clock on most Arduino boards + + // for a one-microsecond delay, simply return. the overhead + // of the function call takes 14 (16) cycles, which is 1us + if (us <= 1) return; // = 3 cycles, (4 when true) + + // the following loop takes 1/4 of a microsecond (4 cycles) + // per iteration, so execute it four times for each microsecond of + // delay requested. + us <<= 2; // x4 us, = 4 cycles + + // account for the time taken in the preceeding commands. + // we just burned 19 (21) cycles above, remove 5, (5*4=20) + // us is at least 8 so we can substract 5 + us -= 5; // = 2 cycles, + +#elif F_CPU >= 12000000L + // for the 12 MHz clock if somebody is working with USB + + // for a 1 microsecond delay, simply return. the overhead + // of the function call takes 14 (16) cycles, which is 1.5us + if (us <= 1) return; // = 3 cycles, (4 when true) + + // the following loop takes 1/3 of a microsecond (4 cycles) + // per iteration, so execute it three times for each microsecond of + // delay requested. + us = (us << 1) + us; // x3 us, = 5 cycles + + // account for the time taken in the preceeding commands. + // we just burned 20 (22) cycles above, remove 5, (5*4=20) + // us is at least 6 so we can substract 5 + us -= 5; //2 cycles + +#elif F_CPU >= 8000000L + // for the 8 MHz internal clock + + // for a 1 and 2 microsecond delay, simply return. the overhead + // of the function call takes 14 (16) cycles, which is 2us + if (us <= 2) return; // = 3 cycles, (4 when true) + + // the following loop takes 1/2 of a microsecond (4 cycles) + // per iteration, so execute it twice for each microsecond of + // delay requested. + us <<= 1; //x2 us, = 2 cycles + + // account for the time taken in the preceeding commands. + // we just burned 17 (19) cycles above, remove 4, (4*4=16) + // us is at least 6 so we can substract 4 + us -= 4; // = 2 cycles + +#else + // for the 1 MHz internal clock (default settings for common Atmega microcontrollers) + + // the overhead of the function calls is 14 (16) cycles + if (us <= 16) return; //= 3 cycles, (4 when true) + if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to substract 22) + + // compensate for the time taken by the preceeding and next commands (about 22 cycles) + us -= 22; // = 2 cycles + // the following loop takes 4 microseconds (4 cycles) + // per iteration, so execute it us/4 times + // us is at least 4, divided by 4 gives us 1 (no zero delay bug) + us >>= 2; // us div 4, = 4 cycles + + +#endif + + // busy wait + __asm__ __volatile__ ( + "1: sbiw %0,1" "\n\t" // 2 cycles + "brne 1b" : "=w" (us) : "0" (us) // 2 cycles + ); + // return = 4 cycles +#endif +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay.c new file mode 100644 index 00000000..77289a17 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-delay.c @@ -0,0 +1,30 @@ +#include "wiring-header.h" + +/** + * Delay for the given number of milliseconds. + * + * Do a busy wait. Using the lower 16 bits of micros() is enough, as the + * difference between the start time and the current time will never be much + * higher than 1000. + * + * Using unsigned values is helpful here. This way value wrap-arounds between + * start and now do not result in negative values but in the wanted absolute + * difference. The magic of modulo-arithmethics. + */ +void delay(unsigned long ms) +{ + uint16_t start, now; + + start = (uint16_t) micros(); // use the lower 16 bits + + while (ms > 0) { + yield(); + now = (uint16_t) micros(); // use the lower 16 bits + while ( (ms > 0) && ((uint16_t)(now-start) >= 1000) ) { + ms--; + start += 1000; + } + } +} + + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-header.h b/sduino/hardware/sduino/stm8/cores/sduino/wiring-header.h new file mode 100644 index 00000000..e0882fba --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-header.h @@ -0,0 +1,76 @@ +/* + wiring.c - Partial implementation of the Wiring API for the ATmega8. + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + 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 + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + 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., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA +*/ + +#include "wiring_private.h" + + +/* calculate the best prescaler and timer period for TIM4 for millis() + * + * The precaler factor could be calculated from the prescaler enum by + * bit shifting, but we want to be independent from possible irregular + * definitions for the chose CPU type. + */ +#if (clockCyclesPerMillisecond() < 256) +# define T4PRESCALER TIM4_PRESCALER_1 +# define T4PRESCALER_FACTOR 1 +#elif (clockCyclesPerMillisecond() < 512) +# define T4PRESCALER TIM4_PRESCALER_2 +# define T4PRESCALER_FACTOR 2 +#elif (clockCyclesPerMillisecond() < 1024) +# define T4PRESCALER TIM4_PRESCALER_4 +# define T4PRESCALER_FACTOR 4 +#elif (clockCyclesPerMillisecond() < 2048) +# define T4PRESCALER TIM4_PRESCALER_8 +# define T4PRESCALER_FACTOR 8 +#elif (clockCyclesPerMillisecond() < 4096) +# define T4PRESCALER TIM4_PRESCALER_16 +# define T4PRESCALER_FACTOR 16 +#elif (clockCyclesPerMillisecond() < 8192) +# define T4PRESCALER TIM4_PRESCALER_32 +# define T4PRESCALER_FACTOR 32 +#elif (clockCyclesPerMillisecond() < 16384) +# define T4PRESCALER TIM4_PRESCALER_64 +# define T4PRESCALER_FACTOR 64 +#elif (clockCyclesPerMillisecond() < 32768) +# define T4PRESCALER TIM4_PRESCALER_128 +# define T4PRESCALER_FACTOR 128 +#else +#error "could not calculate a valid prescaler für TIM4" +#endif +#define T4PERIOD (clockCyclesPerMillisecond()/T4PRESCALER_FACTOR) + +// the prescaler is set so that timer4 ticks every 64 clock cycles, and the +// the overflow handler is called every 250 ticks. +# define MICROSECONDS_PER_TIMER0_OVERFLOW (F_CPU/(T4PRESCALER_FACTOR*T4PERIOD)) +//#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 250)) + +// the whole number of milliseconds per timer4 overflow +#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) + +// the fractional number of milliseconds per timer4 overflow. we shift right +// by three to fit these numbers into a byte. (for the clock speeds we care +// about - 8 and 16 MHz - this doesn't lose precision.) +#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) +#define FRACT_MAX (1000 >> 3) + +extern volatile unsigned long timer4_overflow_count;// = 0; +extern volatile unsigned long timer4_millis;// = 0; diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-init.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-init.c new file mode 100644 index 00000000..13511ae1 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-init.c @@ -0,0 +1,271 @@ +#include "wiring-header.h" + +/** + */ +void init() +{ +#ifndef ENABLE_SWIM + // free the SWIM pin to be used as a general I/O-Pin + CFG->GCR = CFG_GCR_SWD; +#endif + + // set the clock to 16 MHz +#ifdef USE_SPL + CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); +#else + CLK->CKDIVR = 0; +#endif + + GPIO_DeInit(GPIOA); + GPIO_DeInit(GPIOB); + GPIO_DeInit(GPIOC); + GPIO_DeInit(GPIOD); + GPIO_DeInit(GPIOE); // not present on STM8S103 + GPIO_DeInit(GPIOF); // not present on STM8S103 +#if defined(GPIOG) + GPIO_DeInit(GPIOG); +#endif +#if defined(GPIOH) + GPIO_DeInit(GPIOH); +#endif +#if defined(GPIOI) + GPIO_DeInit(GPIOI); +#endif + +#if defined(UART1) + UART1_DeInit(); +#else + UART2_DeInit(); +#endif + + // set timer 4 prescale factor and period (typ. @16MHz: 64*250=1ms) + TIM4_DeInit(); +#ifdef USE_SPL + // set timer 4 prescale factor and period (typ. @16MHz: 64*250=1ms) + TIM4_TimeBaseInit(T4PRESCALER, (uint8_t) T4PERIOD-1); + /* Clear TIM4 update flag */ + TIM4_ClearFlag(TIM4_FLAG_UPDATE); // TIM4->SR1 = (uint8_t)(~0x01); + /* Enable update interrupt */ + TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); // TIM4->IER |= (uint8_t)TIM4_IT; + /* Enable TIM4 */ + TIM4_Cmd(ENABLE); // TIM4->CR1 |= TIM4_CR1_CEN; +#else + // set timer 4 prescale factor (typ. @16MHz: 64) + TIM4->PSCR = (uint8_t)(T4PRESCALER); + // set timer 4 autoreload value/period (typ. @16MHz: 250-1) + TIM4->ARR = (uint8_t)(T4PERIOD-1); + /* Clear TIM4 update flag by writing 0. Writing ones has no effect */ + TIM4->SR1 = (uint8_t)(~TIM4_FLAG_UPDATE); + /* Enable update interrupt */ + TIM4->IER |= TIM4_IT_UPDATE; + /* Enable TIM4 */ + TIM4->CR1 |= TIM4_CR1_CEN; +#endif + + + // timers 1 and 2 are used for phase-correct hardware pwm + // this is better for motors as it ensures an even waveform + // note, however, that fast pwm mode can achieve a frequency of up + // 8 MHz (with a 16 MHz clock) at 50% duty cycle +#ifndef NO_ANALOG_OUT + TIM1_DeInit(); // keep this + // actual prescaler is (n+1) + TIM1_TimeBaseInit(63, TIM1_COUNTERMODE_UP, 255, 0); // keep this +#ifdef USE_SPL + TIM1_Cmd(ENABLE); + + TIM1_OC1Init( + TIM1_OCMODE_PWM2, + TIM1_OUTPUTSTATE_DISABLE, + TIM1_OUTPUTNSTATE_DISABLE, + 0, + TIM1_OCPOLARITY_HIGH, + TIM1_OCNPOLARITY_HIGH, + TIM1_OCIDLESTATE_SET, + TIM1_OCNIDLESTATE_SET + ); + TIM1_OC2Init( + TIM1_OCMODE_PWM2, + TIM1_OUTPUTSTATE_DISABLE, + TIM1_OUTPUTNSTATE_DISABLE, + 0, + TIM1_OCPOLARITY_HIGH, + TIM1_OCNPOLARITY_HIGH, + TIM1_OCIDLESTATE_SET, + TIM1_OCNIDLESTATE_SET + ); + TIM1_OC3Init( + TIM1_OCMODE_PWM2, + TIM1_OUTPUTSTATE_DISABLE, + TIM1_OUTPUTNSTATE_DISABLE, + 0, + TIM1_OCPOLARITY_HIGH, + TIM1_OCNPOLARITY_HIGH, + TIM1_OCIDLESTATE_SET, + TIM1_OCNIDLESTATE_SET + ); + TIM1_OC4Init( + TIM1_OCMODE_PWM2, + TIM1_OUTPUTSTATE_DISABLE, + 0, + TIM1_OCPOLARITY_HIGH, + TIM1_OCIDLESTATE_SET + ); + TIM1_Cmd(ENABLE); + TIM1_CtrlPWMOutputs(ENABLE); +#else + TIM1->CCER1 = 0; // channel 1 and 2 disabled + TIM1->CCER2 = 0; // channel 3 and 4 disabled + + TIM1->CCMR1 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; + TIM1->CCMR2 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; + TIM1->CCMR3 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; + TIM1->CCMR4 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; +/* already done by TIM1_DeInit() + TIM1->CCR1H = 0; // write MSB first, DO NOT USE ldw instruction! + TIM1->CCR1L = 0; + TIM1->CCR2H = 0; // write MSB first, DO NOT USE ldw instruction! + TIM1->CCR2L = 0; + TIM1->CCR3H = 0; // write MSB first, DO NOT USE ldw instruction! + TIM1->CCR3L = 0; + TIM1->CCR4H = 0; // write MSB first, DO NOT USE ldw instruction! + TIM1->CCR4L = 0; +*/ + TIM1->CR1 = TIM1_CR1_CEN; // TIM1_Cmd(ENABLE); + TIM1->BKR = TIM1_BKR_MOE; // TIM1_CtrlPWMOutputs(ENABLE); +#endif + +#ifdef TIM2 + TIM2_DeInit(); + TIM2_TimeBaseInit(TIM2_PRESCALER_64, 255); + +#ifdef USE_SPL + TIM2_OC1Init( + TIM2_OCMODE_PWM1, + TIM2_OUTPUTSTATE_DISABLE, + 0, + TIM2_OCPOLARITY_HIGH + ); + + TIM2_OC2Init( + TIM2_OCMODE_PWM1, + TIM2_OUTPUTSTATE_DISABLE, + 0, + TIM2_OCPOLARITY_HIGH + ); + + TIM2_OC3Init( + TIM2_OCMODE_PWM1, + TIM2_OUTPUTSTATE_DISABLE, + 0, + TIM2_OCPOLARITY_HIGH + ); + TIM2_OC1PreloadConfig(ENABLE); // TIM2->CCMR1 |= (uint8_t)TIM2_CCMR_OCxPE; + TIM2_OC2PreloadConfig(ENABLE); // TIM2->CCMR2 |= (uint8_t)TIM2_CCMR_OCxPE; + TIM2_OC3PreloadConfig(ENABLE); // TIM2->CCMR3 |= (uint8_t)TIM2_CCMR_OCxPE; + TIM2_Cmd(ENABLE); // TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN; +#else + TIM2->CCER1 = 0; // channel 1 and 2 disabled + TIM2->CCER2 = 0; // channel 3 and 4 disabled + + TIM2->CCMR1 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; + TIM2->CCMR2 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; + TIM2->CCMR3 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; + + TIM2->CR1 = TIM2_CR1_CEN; // TIM1_Cmd(ENABLE); +#endif +#endif // #ifdef (TIM2) + +#ifdef TIM3 + TIM3_DeInit(); + TIM3_TimeBaseInit(TIM3_PRESCALER_64, 255); + +#ifdef USE_SPL + TIM3_OC1Init( + TIM3_OCMODE_PWM1, + TIM3_OUTPUTSTATE_DISABLE, + 0, + TIM3_OCPOLARITY_HIGH + ); + + TIM3_OC2Init( + TIM3_OCMODE_PWM1, + TIM3_OUTPUTSTATE_DISABLE, + 0, + TIM3_OCPOLARITY_HIGH + ); + + TIM3_OC1PreloadConfig(ENABLE); // TIM3->CCMR1 |= (uint8_t)TIM3_CCMR_OCxPE; + TIM3_OC2PreloadConfig(ENABLE); // TIM3->CCMR2 |= (uint8_t)TIM3_CCMR_OCxPE; + TIM3_Cmd(ENABLE); // TIM3->CR1 |= (uint8_t)TIM3_CR1_CEN; +#else + TIM3->CCER1 = 0; // channel 1 and 2 disabled +// TIM3->CCER2 = 0; // channel 3 disabled + + TIM3->CCMR1 = TIM3_OCMODE_PWM1 | TIM3_CCMR_OCxPE; + TIM3->CCMR2 = TIM3_OCMODE_PWM1 | TIM3_CCMR_OCxPE; + + TIM3->CR1 = TIM3_CR1_CEN; // TIM1_Cmd(ENABLE); +#endif +#endif // #ifdef (TIM3) +#endif // ifndef NO_ANALOG_OUT + +#ifndef NO_ANALOG_IN + + /* De-Init ADC peripheral, sets prescaler to 2 */ + #if defined(ADC1) + ADC1_DeInit(); + // optional: + // set a2d prescaler so we are inside a range of 1-2 MHz + #if F_CPU >= 18000000 // 18 MHz / 18 = 1000 KHz + ADC1->CR1 = 7 <<4; + #elif F_CPU >= 12000000 // 12 MHz / 12 = 1000 kHz + ADC1->CR1 = 6 <<4; + #elif F_CPU >= 10000000 // 10 MHz / 10 = 1000 kHz + ADC1->CR1 = 5 <<4; + #elif F_CPU >= 8000000 // 8 MHz / 8 = 1000 kHz + ADC1->CR1 = 4 <<4; + #elif F_CPU >= 6000000 // 6 MHz / 6 = 1000 kHz + ADC1->CR1 = 4 <<4; + #elif F_CPU >= 4000000 // 4 MHz / 4 = 1000 kHz + ADC1->CR1 = 3 <<4; + #elif F_CPU >= 3000000 // 3 MHz / 3 = 1000 kHz + ADC1->CR1 = 2 <<4; + #elif F_CPU >= 2000000 // 2 MHz / 2 = 1000 kHz + ADC1->CR1 = 1 <<4; + //#else // minimum prescaler is 2, already set by ADC1_DeInit(); + // ADC1->CR1 = 0 <<4; + #endif + + #elif defined(ADC2) + ADC2_DeInit(); + // optional: + // set a2d prescaler so we are inside a range of 1-2 MHz + #if F_CPU >= 18000000 // 18 MHz / 18 = 1000 KHz + ADC2->CR1 = 7 <<4; + #elif F_CPU >= 12000000 // 12 MHz / 12 = 1000 kHz + ADC2->CR1 = 6 <<4; + #elif F_CPU >= 10000000 // 10 MHz / 10 = 1000 kHz + ADC2->CR1 = 5 <<4; + #elif F_CPU >= 8000000 // 8 MHz / 8 = 1000 kHz + ADC2->CR1 = 4 <<4; + #elif F_CPU >= 6000000 // 6 MHz / 6 = 1000 kHz + ADC2->CR1 = 4 <<4; + #elif F_CPU >= 4000000 // 4 MHz / 4 = 1000 kHz + ADC2->CR1 = 3 <<4; + #elif F_CPU >= 3000000 // 3 MHz / 3 = 1000 kHz + ADC2->CR1 = 2 <<4; + #elif F_CPU >= 2000000 // 2 MHz / 2 = 1000 kHz + ADC2->CR1 = 1 <<4; + //#else // minimum prescaler is 2, already set by ADC1_DeInit(); + // ADC2->CR1 = 0 <<4; + #endif + + #endif // ADC2 + +#endif // ifndef NO_ANALOG_IN + + // this needs to be called before setup() or some functions won't + // work there + enableInterrupts(); +} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-micros.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-micros.c new file mode 100644 index 00000000..3cb2f914 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-micros.c @@ -0,0 +1,52 @@ +#include "wiring-header.h" + +/** + */ +unsigned long micros() +{ +#ifdef USE_SPL + unsigned long m; + uint8_t t; + + BEGIN_CRITICAL + m = timer4_overflow_count; + t = TIM4_GetCounter(); + + // check if a fresh update event is still pending + // if (TIM4->SR1 & 0x01) + if ((TIM4_GetFlagStatus(TIM4_IT_UPDATE)==SET) && (t < (T4PERIOD-1))) + m++; + END_CRITICAL + +// return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +// return ((m*250+t) * (64/16) ); // FIXME: use calculated value + m *= T4PERIOD; + m += t; +// m <<= 2; + m *= ((T4PRESCALER_FACTOR*1000000L)/(F_CPU)); + return m; +#else + unsigned long m; + uint8_t t; + + BEGIN_CRITICAL + m = timer4_overflow_count; + t = TIM4->CNTR; + + // check if a fresh update event is still pending + // if (TIM4->SR1 & 0x01) + if ((TIM4->SR1 & (uint8_t)TIM4_IT_UPDATE) && (t < (T4PERIOD-1))) + m++; + END_CRITICAL + +// return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +// return ((m*250+t) * (64/16) ); // FIXME: use calculated value + m *= T4PERIOD; + m += t; +// m <<= 2; + m *= ((T4PRESCALER_FACTOR*1000000L)/(F_CPU)); + return m; +#endif +} + + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring-millis.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring-millis.c new file mode 100644 index 00000000..d9fc32b6 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring-millis.c @@ -0,0 +1,50 @@ +#include "wiring-header.h" + +volatile unsigned long timer4_overflow_count;// = 0; +volatile unsigned long timer4_millis;// = 0; +static unsigned char timer4_fract;// = 0; + +//void TIM4_UPD_OVF_IRQHandler(void) __interrupt(ITC_IRQ_TIM4_OVF) /* TIM4 UPD/OVF */ +//void TIM4_UPD_OVF_IRQHandler(void) __interrupt(5)//FIXME +INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, ITC_IRQ_TIM4_OVF) /* TIM4 UPD/OVF */ +{ + // copy these to local variables so they can be stored in registers + // (volatile variables must be read from memory on every access) + unsigned long m = timer4_millis; +#if (FRACT_INC != 0) + unsigned char f = timer4_fract; +#endif + + m += MILLIS_INC; +#if (FRACT_INC != 0) + f += FRACT_INC; + if (f >= FRACT_MAX) { + f -= FRACT_MAX; + m += 1; + } + + timer4_fract = f; +#endif + timer4_millis = m; + timer4_overflow_count++; + + /* Clear Interrupt Pending bit */ +#ifdef USE_SPL + TIM4_ClearITPendingBit(TIM4_IT_UPDATE); +#else + TIM4->SR1 = (uint8_t)(~TIM4_IT_UPDATE); +#endif +} + +unsigned long millis() +{ + unsigned long m; + + // disable interrupts while we read timer4_millis or we might get an + // inconsistent value (e.g. in the middle of a write to timer4_millis) + BEGIN_CRITICAL + m = timer4_millis; + END_CRITICAL + + return m; +} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring.c deleted file mode 100644 index 0f8f9c23..00000000 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring.c +++ /dev/null @@ -1,713 +0,0 @@ -/* - wiring.c - Partial implementation of the Wiring API for the ATmega8. - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - 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 - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - 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., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -#include "wiring_private.h" - - -/* calculate the best prescaler and timer period for TIM4 for millis() - * - * The precaler factor could be calculated from the prescaler enum by - * bit shifting, but we want to be independent from possible irregular - * definitions for the chose CPU type. - */ -#if (clockCyclesPerMillisecond() < 256) -# define T4PRESCALER TIM4_PRESCALER_1 -# define T4PRESCALER_FACTOR 1 -#elif (clockCyclesPerMillisecond() < 512) -# define T4PRESCALER TIM4_PRESCALER_2 -# define T4PRESCALER_FACTOR 2 -#elif (clockCyclesPerMillisecond() < 1024) -# define T4PRESCALER TIM4_PRESCALER_4 -# define T4PRESCALER_FACTOR 4 -#elif (clockCyclesPerMillisecond() < 2048) -# define T4PRESCALER TIM4_PRESCALER_8 -# define T4PRESCALER_FACTOR 8 -#elif (clockCyclesPerMillisecond() < 4096) -# define T4PRESCALER TIM4_PRESCALER_16 -# define T4PRESCALER_FACTOR 16 -#elif (clockCyclesPerMillisecond() < 8192) -# define T4PRESCALER TIM4_PRESCALER_32 -# define T4PRESCALER_FACTOR 32 -#elif (clockCyclesPerMillisecond() < 16384) -# define T4PRESCALER TIM4_PRESCALER_64 -# define T4PRESCALER_FACTOR 64 -#elif (clockCyclesPerMillisecond() < 32768) -# define T4PRESCALER TIM4_PRESCALER_128 -# define T4PRESCALER_FACTOR 128 -#else -#error "could not calculate a valid prescaler für TIM4" -#endif -#define T4PERIOD (clockCyclesPerMillisecond()/T4PRESCALER_FACTOR) - -// the prescaler is set so that timer4 ticks every 64 clock cycles, and the -// the overflow handler is called every 250 ticks. -# define MICROSECONDS_PER_TIMER0_OVERFLOW (F_CPU/(T4PRESCALER_FACTOR*T4PERIOD)) -//#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 250)) - -// the whole number of milliseconds per timer4 overflow -#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) - -// the fractional number of milliseconds per timer4 overflow. we shift right -// by three to fit these numbers into a byte. (for the clock speeds we care -// about - 8 and 16 MHz - this doesn't lose precision.) -#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) -#define FRACT_MAX (1000 >> 3) - -volatile unsigned long timer4_overflow_count;// = 0; -volatile unsigned long timer4_millis;// = 0; -static unsigned char timer4_fract;// = 0; - -//void TIM4_UPD_OVF_IRQHandler(void) __interrupt(ITC_IRQ_TIM4_OVF) /* TIM4 UPD/OVF */ -//void TIM4_UPD_OVF_IRQHandler(void) __interrupt(5)//FIXME -INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, ITC_IRQ_TIM4_OVF) /* TIM4 UPD/OVF */ -{ - // copy these to local variables so they can be stored in registers - // (volatile variables must be read from memory on every access) - unsigned long m = timer4_millis; -#if (FRACT_INC != 0) - unsigned char f = timer4_fract; -#endif - - m += MILLIS_INC; -#if (FRACT_INC != 0) - f += FRACT_INC; - if (f >= FRACT_MAX) { - f -= FRACT_MAX; - m += 1; - } - - timer4_fract = f; -#endif - timer4_millis = m; - timer4_overflow_count++; - - /* Clear Interrupt Pending bit */ -#ifdef USE_SPL - TIM4_ClearITPendingBit(TIM4_IT_UPDATE); -#else - TIM4->SR1 = (uint8_t)(~TIM4_IT_UPDATE); -#endif -} - -unsigned long millis() -{ - unsigned long m; - - // disable interrupts while we read timer4_millis or we might get an - // inconsistent value (e.g. in the middle of a write to timer4_millis) - BEGIN_CRITICAL - m = timer4_millis; - END_CRITICAL - - return m; -} - - -unsigned long micros() -{ -#ifdef USE_SPL - unsigned long m; - uint8_t t; - - BEGIN_CRITICAL - m = timer4_overflow_count; - t = TIM4_GetCounter(); - - // check if a fresh update event is still pending - // if (TIM4->SR1 & 0x01) - if ((TIM4_GetFlagStatus(TIM4_IT_UPDATE)==SET) && (t < (T4PERIOD-1))) - m++; - END_CRITICAL - -// return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); -// return ((m*250+t) * (64/16) ); // FIXME: use calculated value - m *= T4PERIOD; - m += t; -// m <<= 2; - m *= ((T4PRESCALER_FACTOR*1000000L)/(F_CPU)); - return m; -#else - unsigned long m; - uint8_t t; - - BEGIN_CRITICAL - m = timer4_overflow_count; - t = TIM4->CNTR; - - // check if a fresh update event is still pending - // if (TIM4->SR1 & 0x01) - if ((TIM4->SR1 & (uint8_t)TIM4_IT_UPDATE) && (t < (T4PERIOD-1))) - m++; - END_CRITICAL - -// return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); -// return ((m*250+t) * (64/16) ); // FIXME: use calculated value - m *= T4PERIOD; - m += t; -// m <<= 2; - m *= ((T4PRESCALER_FACTOR*1000000L)/(F_CPU)); - return m; -#endif -} - - -/** - * Delay for the given number of milliseconds. - * - * Do a busy wait. Using the lower 16 bits of micros() is enough, as the - * difference between the start time and the current time will never be much - * higher than 1000. - * - * Using unsigned values is helpful here. This way value wrap-arounds between - * start and now do not result in negative values but in the wanted absolute - * difference. The magic of modulo-arithmethics. - */ -void delay(unsigned long ms) -{ - uint16_t start, now; - - start = (uint16_t) micros(); // use the lower 16 bits - - while (ms > 0) { - yield(); - now = (uint16_t) micros(); // use the lower 16 bits - while ( (ms > 0) && ((uint16_t)(now-start) >= 1000) ) { - ms--; - start += 1000; - } - } -} - - -/** - * Delay for the given number of microseconds. - * - * Assumes a 1, 8, 12, 16, 20 or 24 MHz clock. - */ -void delayMicroseconds(unsigned int us) -{ - uint32_t start = micros(); - - // wait until time [us] has passed - while (micros() - start < us) - nop(); - -/* - // call = 4 cycles, return = 4 cycles, arg access = ? cycles -// while (us--); - -#if F_CPU <= 1000000UL -#warning "1m" - us <<= 3; // adjust loop counter for low clock rates -# define LOG_CLOCK (F_CPU*8) -#elsif F_CPU <= 2000000UL -#warning "2m" - us <<= 2; // adjust loop counter for low clock rates -# define LOG_CLOCK 8000000UL //(F_CPU*4) -#elsif F_CPU <= 4000000UL -#warning "3m" - us <<= 1; // adjust loop counter for low clock rates -# define LOG_CLOCK (F_CPU*2) -#else -#warning "else" -# define LOG_CLOCK (F_CPU * 1) -//# define LOG_CLOCK 16000000UL -#endif - - // 13 + (7+nop)*us - unsigned int i; - for (i=us; i; i--) { -#if LOG_CLOCK >=7500000UL - __asm__("nop"); // 7.5..8.5MHz -> 8 cyc/loop -#endif -#if LOG_CLOCK >=8500000UL - __asm__("nop"); // 8.5..9.5MHz -> 9 cyc/loop -#endif -#if LOG_CLOCK >=9500000UL - __asm__("nop"); // 9.5..10.5MHz -> 10 cyc/loop -#endif -#if LOG_CLOCK >=10500000UL - __asm__("nop"); // 10.5..11.5MHz -> 11 cyc/loop -#endif -#if LOG_CLOCK >=11500000UL - __asm__("nop"); // 11.5..12.5MHz -> 12 cyc/loop -#endif - } - - // 25 Grundbedarf incl. call/ret, 7 pro einfachen Schleifendurchlauf - // => t= 25 + 7*us bzs. 25 + 14*us -#if F_CPU >=10000000UL -// for (i=us; i; i--); -#endif -*/ -/*FIXME: Zeitdauer nicht ausgezählt. Das kommt raus: - - 283 ; wiring.c: 124: while (us--);// __asm__ ("nop"); - 00818B 16 03 [ 2] 284 ldw y, (0x03, sp) - 00818D 285 00101$: - 00818D 93 [ 1] 286 ldw x, y - 00818E 90 5A [ 2] 287 decw y - 008190 5D [ 2] 288 tnzw x - 008191 26 FA [ 1] 289 jrne 00101$ - 008193 81 [ 4] 290 ret - - Aufruf und Test: 10 + 6 für 0. Durchlauf = 16 - Pro Durchlauf: 6 -*/ -#if 0 -//FIXME - // call = 4 cycles + 2 to 4 cycles to init us(2 for constant delay, 4 for variable) - - // calling avrlib's delay_us() function with low values (e.g. 1 or - // 2 microseconds) gives delays longer than desired. - //delay_us(us); -#if F_CPU >= 24000000L - // for the 24 MHz clock for the aventurous ones, trying to overclock - - // zero delay fix - if (!us) return; // = 3 cycles, (4 when true) - - // the following loop takes a 1/6 of a microsecond (4 cycles) - // per iteration, so execute it six times for each microsecond of - // delay requested. - us *= 6; // x6 us, = 7 cycles - - // account for the time taken in the preceeding commands. - // we just burned 22 (24) cycles above, remove 5, (5*4=20) - // us is at least 6 so we can substract 5 - us -= 5; //=2 cycles - -#elif F_CPU >= 20000000L - // for the 20 MHz clock on rare Arduino boards - - // for a one-microsecond delay, simply return. the overhead - // of the function call takes 18 (20) cycles, which is 1us - __asm__ __volatile__ ( - "nop" "\n\t" - "nop" "\n\t" - "nop" "\n\t" - "nop"); //just waiting 4 cycles - if (us <= 1) return; // = 3 cycles, (4 when true) - - // the following loop takes a 1/5 of a microsecond (4 cycles) - // per iteration, so execute it five times for each microsecond of - // delay requested. - us = (us << 2) + us; // x5 us, = 7 cycles - - // account for the time taken in the preceeding commands. - // we just burned 26 (28) cycles above, remove 7, (7*4=28) - // us is at least 10 so we can substract 7 - us -= 7; // 2 cycles - -#elif F_CPU >= 16000000L - // for the 16 MHz clock on most Arduino boards - - // for a one-microsecond delay, simply return. the overhead - // of the function call takes 14 (16) cycles, which is 1us - if (us <= 1) return; // = 3 cycles, (4 when true) - - // the following loop takes 1/4 of a microsecond (4 cycles) - // per iteration, so execute it four times for each microsecond of - // delay requested. - us <<= 2; // x4 us, = 4 cycles - - // account for the time taken in the preceeding commands. - // we just burned 19 (21) cycles above, remove 5, (5*4=20) - // us is at least 8 so we can substract 5 - us -= 5; // = 2 cycles, - -#elif F_CPU >= 12000000L - // for the 12 MHz clock if somebody is working with USB - - // for a 1 microsecond delay, simply return. the overhead - // of the function call takes 14 (16) cycles, which is 1.5us - if (us <= 1) return; // = 3 cycles, (4 when true) - - // the following loop takes 1/3 of a microsecond (4 cycles) - // per iteration, so execute it three times for each microsecond of - // delay requested. - us = (us << 1) + us; // x3 us, = 5 cycles - - // account for the time taken in the preceeding commands. - // we just burned 20 (22) cycles above, remove 5, (5*4=20) - // us is at least 6 so we can substract 5 - us -= 5; //2 cycles - -#elif F_CPU >= 8000000L - // for the 8 MHz internal clock - - // for a 1 and 2 microsecond delay, simply return. the overhead - // of the function call takes 14 (16) cycles, which is 2us - if (us <= 2) return; // = 3 cycles, (4 when true) - - // the following loop takes 1/2 of a microsecond (4 cycles) - // per iteration, so execute it twice for each microsecond of - // delay requested. - us <<= 1; //x2 us, = 2 cycles - - // account for the time taken in the preceeding commands. - // we just burned 17 (19) cycles above, remove 4, (4*4=16) - // us is at least 6 so we can substract 4 - us -= 4; // = 2 cycles - -#else - // for the 1 MHz internal clock (default settings for common Atmega microcontrollers) - - // the overhead of the function calls is 14 (16) cycles - if (us <= 16) return; //= 3 cycles, (4 when true) - if (us <= 25) return; //= 3 cycles, (4 when true), (must be at least 25 if we want to substract 22) - - // compensate for the time taken by the preceeding and next commands (about 22 cycles) - us -= 22; // = 2 cycles - // the following loop takes 4 microseconds (4 cycles) - // per iteration, so execute it us/4 times - // us is at least 4, divided by 4 gives us 1 (no zero delay bug) - us >>= 2; // us div 4, = 4 cycles - - -#endif - - // busy wait - __asm__ __volatile__ ( - "1: sbiw %0,1" "\n\t" // 2 cycles - "brne 1b" : "=w" (us) : "0" (us) // 2 cycles - ); - // return = 4 cycles -#endif -} - -#ifdef SUPPORT_ALTERNATE_MAPPINGS -/** - * Helper function for STM8: Switch to the alternate pin functions - * - * a) flexible function: supports switching diffent AFR bits for - * multiple set of pins. Not needed for stm8s103, but might be useful - * for bigger parts. - */ -/* -void alternateFunction(uint8_t pin, uint8_t val) -{ - uint16_t optionbyte; - uint8_t afr; - - afr = digitalPinToAFR(pin); - if (afr>7) return; // ignore request on invalid pin - - optionbyte = FLASH_ReadOptionByte(OPT->OPT2); - - // flip the bit if the current state differs from requested state - if ( ((optionbyte & (1<OPT2, (optionbyte&0xff)^(1<> 8; -// optionbyte = FLASH_ReadOptionByte(OPT->OPT2) >> 8; - - // flip the bit if the current state differs from requested state - if ( (optionbyte & (1<<0) == 0) ^ (val==0) ) { - FLASH_Unlock(FLASH_MEMTYPE_DATA); -// FLASH_ProgramOptionByte(OPT->OPT2, (optionbyte&0xff)^(1<<0)); - FLASH_ProgramOptionByte(0x4803, optionbyte^(1<<0)); - FLASH_Lock(FLASH_MEMTYPE_DATA); - } -} -#endif - -void init() -{ -#ifndef ENABLE_SWIM - // free the SWIM pin to be used as a general I/O-Pin - CFG->GCR = CFG_GCR_SWD; -#endif - - // set the clock to 16 MHz -#ifdef USE_SPL - CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); -#else - CLK->CKDIVR = 0; -#endif - - GPIO_DeInit(GPIOA); - GPIO_DeInit(GPIOB); - GPIO_DeInit(GPIOC); - GPIO_DeInit(GPIOD); - GPIO_DeInit(GPIOE); // not present on STM8S103 - GPIO_DeInit(GPIOF); // not present on STM8S103 -#if defined(GPIOG) - GPIO_DeInit(GPIOG); -#endif -#if defined(GPIOH) - GPIO_DeInit(GPIOH); -#endif -#if defined(GPIOI) - GPIO_DeInit(GPIOI); -#endif - -#if defined(UART1) - UART1_DeInit(); -#else - UART2_DeInit(); -#endif - - // set timer 4 prescale factor and period (typ. @16MHz: 64*250=1ms) - TIM4_DeInit(); -#ifdef USE_SPL - // set timer 4 prescale factor and period (typ. @16MHz: 64*250=1ms) - TIM4_TimeBaseInit(T4PRESCALER, (uint8_t) T4PERIOD-1); - /* Clear TIM4 update flag */ - TIM4_ClearFlag(TIM4_FLAG_UPDATE); // TIM4->SR1 = (uint8_t)(~0x01); - /* Enable update interrupt */ - TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); // TIM4->IER |= (uint8_t)TIM4_IT; - /* Enable TIM4 */ - TIM4_Cmd(ENABLE); // TIM4->CR1 |= TIM4_CR1_CEN; -#else - // set timer 4 prescale factor (typ. @16MHz: 64) - TIM4->PSCR = (uint8_t)(T4PRESCALER); - // set timer 4 autoreload value/period (typ. @16MHz: 250-1) - TIM4->ARR = (uint8_t)(T4PERIOD-1); - /* Clear TIM4 update flag by writing 0. Writing ones has no effect */ - TIM4->SR1 = (uint8_t)(~TIM4_FLAG_UPDATE); - /* Enable update interrupt */ - TIM4->IER |= TIM4_IT_UPDATE; - /* Enable TIM4 */ - TIM4->CR1 |= TIM4_CR1_CEN; -#endif - - - // timers 1 and 2 are used for phase-correct hardware pwm - // this is better for motors as it ensures an even waveform - // note, however, that fast pwm mode can achieve a frequency of up - // 8 MHz (with a 16 MHz clock) at 50% duty cycle -#ifndef NO_ANALOG_OUT - TIM1_DeInit(); // keep this - // actual prescaler is (n+1) - TIM1_TimeBaseInit(63, TIM1_COUNTERMODE_UP, 255, 0); // keep this -#ifdef USE_SPL - TIM1_Cmd(ENABLE); - - TIM1_OC1Init( - TIM1_OCMODE_PWM2, - TIM1_OUTPUTSTATE_DISABLE, - TIM1_OUTPUTNSTATE_DISABLE, - 0, - TIM1_OCPOLARITY_HIGH, - TIM1_OCNPOLARITY_HIGH, - TIM1_OCIDLESTATE_SET, - TIM1_OCNIDLESTATE_SET - ); - TIM1_OC2Init( - TIM1_OCMODE_PWM2, - TIM1_OUTPUTSTATE_DISABLE, - TIM1_OUTPUTNSTATE_DISABLE, - 0, - TIM1_OCPOLARITY_HIGH, - TIM1_OCNPOLARITY_HIGH, - TIM1_OCIDLESTATE_SET, - TIM1_OCNIDLESTATE_SET - ); - TIM1_OC3Init( - TIM1_OCMODE_PWM2, - TIM1_OUTPUTSTATE_DISABLE, - TIM1_OUTPUTNSTATE_DISABLE, - 0, - TIM1_OCPOLARITY_HIGH, - TIM1_OCNPOLARITY_HIGH, - TIM1_OCIDLESTATE_SET, - TIM1_OCNIDLESTATE_SET - ); - TIM1_OC4Init( - TIM1_OCMODE_PWM2, - TIM1_OUTPUTSTATE_DISABLE, - 0, - TIM1_OCPOLARITY_HIGH, - TIM1_OCIDLESTATE_SET - ); - TIM1_Cmd(ENABLE); - TIM1_CtrlPWMOutputs(ENABLE); -#else - TIM1->CCER1 = 0; // channel 1 and 2 disabled - TIM1->CCER2 = 0; // channel 3 and 4 disabled - - TIM1->CCMR1 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; - TIM1->CCMR2 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; - TIM1->CCMR3 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; - TIM1->CCMR4 = TIM1_OCMODE_PWM2 | TIM1_CCMR_OCxPE; -/* already done by TIM1_DeInit() - TIM1->CCR1H = 0; // write MSB first, DO NOT USE ldw instruction! - TIM1->CCR1L = 0; - TIM1->CCR2H = 0; // write MSB first, DO NOT USE ldw instruction! - TIM1->CCR2L = 0; - TIM1->CCR3H = 0; // write MSB first, DO NOT USE ldw instruction! - TIM1->CCR3L = 0; - TIM1->CCR4H = 0; // write MSB first, DO NOT USE ldw instruction! - TIM1->CCR4L = 0; -*/ - TIM1->CR1 = TIM1_CR1_CEN; // TIM1_Cmd(ENABLE); - TIM1->BKR = TIM1_BKR_MOE; // TIM1_CtrlPWMOutputs(ENABLE); -#endif - -#ifdef TIM2 - TIM2_DeInit(); - TIM2_TimeBaseInit(TIM2_PRESCALER_64, 255); - -#ifdef USE_SPL - TIM2_OC1Init( - TIM2_OCMODE_PWM1, - TIM2_OUTPUTSTATE_DISABLE, - 0, - TIM2_OCPOLARITY_HIGH - ); - - TIM2_OC2Init( - TIM2_OCMODE_PWM1, - TIM2_OUTPUTSTATE_DISABLE, - 0, - TIM2_OCPOLARITY_HIGH - ); - - TIM2_OC3Init( - TIM2_OCMODE_PWM1, - TIM2_OUTPUTSTATE_DISABLE, - 0, - TIM2_OCPOLARITY_HIGH - ); - TIM2_OC1PreloadConfig(ENABLE); // TIM2->CCMR1 |= (uint8_t)TIM2_CCMR_OCxPE; - TIM2_OC2PreloadConfig(ENABLE); // TIM2->CCMR2 |= (uint8_t)TIM2_CCMR_OCxPE; - TIM2_OC3PreloadConfig(ENABLE); // TIM2->CCMR3 |= (uint8_t)TIM2_CCMR_OCxPE; - TIM2_Cmd(ENABLE); // TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN; -#else - TIM2->CCER1 = 0; // channel 1 and 2 disabled - TIM2->CCER2 = 0; // channel 3 and 4 disabled - - TIM2->CCMR1 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; - TIM2->CCMR2 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; - TIM2->CCMR3 = TIM2_OCMODE_PWM1 | TIM2_CCMR_OCxPE; - - TIM2->CR1 = TIM2_CR1_CEN; // TIM1_Cmd(ENABLE); -#endif -#endif // #ifdef (TIM2) - -#ifdef TIM3 - TIM3_DeInit(); - TIM3_TimeBaseInit(TIM3_PRESCALER_64, 255); - -#ifdef USE_SPL - TIM3_OC1Init( - TIM3_OCMODE_PWM1, - TIM3_OUTPUTSTATE_DISABLE, - 0, - TIM3_OCPOLARITY_HIGH - ); - - TIM3_OC2Init( - TIM3_OCMODE_PWM1, - TIM3_OUTPUTSTATE_DISABLE, - 0, - TIM3_OCPOLARITY_HIGH - ); - - TIM3_OC1PreloadConfig(ENABLE); // TIM3->CCMR1 |= (uint8_t)TIM3_CCMR_OCxPE; - TIM3_OC2PreloadConfig(ENABLE); // TIM3->CCMR2 |= (uint8_t)TIM3_CCMR_OCxPE; - TIM3_Cmd(ENABLE); // TIM3->CR1 |= (uint8_t)TIM3_CR1_CEN; -#else - TIM3->CCER1 = 0; // channel 1 and 2 disabled -// TIM3->CCER2 = 0; // channel 3 disabled - - TIM3->CCMR1 = TIM3_OCMODE_PWM1 | TIM3_CCMR_OCxPE; - TIM3->CCMR2 = TIM3_OCMODE_PWM1 | TIM3_CCMR_OCxPE; - - TIM3->CR1 = TIM3_CR1_CEN; // TIM1_Cmd(ENABLE); -#endif -#endif // #ifdef (TIM3) -#endif // ifndef NO_ANALOG_OUT - -#ifndef NO_ANALOG_IN - - /* De-Init ADC peripheral, sets prescaler to 2 */ - #if defined(ADC1) - ADC1_DeInit(); - // optional: - // set a2d prescaler so we are inside a range of 1-2 MHz - #if F_CPU >= 18000000 // 18 MHz / 18 = 1000 KHz - ADC1->CR1 = 7 <<4; - #elif F_CPU >= 12000000 // 12 MHz / 12 = 1000 kHz - ADC1->CR1 = 6 <<4; - #elif F_CPU >= 10000000 // 10 MHz / 10 = 1000 kHz - ADC1->CR1 = 5 <<4; - #elif F_CPU >= 8000000 // 8 MHz / 8 = 1000 kHz - ADC1->CR1 = 4 <<4; - #elif F_CPU >= 6000000 // 6 MHz / 6 = 1000 kHz - ADC1->CR1 = 4 <<4; - #elif F_CPU >= 4000000 // 4 MHz / 4 = 1000 kHz - ADC1->CR1 = 3 <<4; - #elif F_CPU >= 3000000 // 3 MHz / 3 = 1000 kHz - ADC1->CR1 = 2 <<4; - #elif F_CPU >= 2000000 // 2 MHz / 2 = 1000 kHz - ADC1->CR1 = 1 <<4; - //#else // minimum prescaler is 2, already set by ADC1_DeInit(); - // ADC1->CR1 = 0 <<4; - #endif - - #elif defined(ADC2) - ADC2_DeInit(); - // optional: - // set a2d prescaler so we are inside a range of 1-2 MHz - #if F_CPU >= 18000000 // 18 MHz / 18 = 1000 KHz - ADC2->CR1 = 7 <<4; - #elif F_CPU >= 12000000 // 12 MHz / 12 = 1000 kHz - ADC2->CR1 = 6 <<4; - #elif F_CPU >= 10000000 // 10 MHz / 10 = 1000 kHz - ADC2->CR1 = 5 <<4; - #elif F_CPU >= 8000000 // 8 MHz / 8 = 1000 kHz - ADC2->CR1 = 4 <<4; - #elif F_CPU >= 6000000 // 6 MHz / 6 = 1000 kHz - ADC2->CR1 = 4 <<4; - #elif F_CPU >= 4000000 // 4 MHz / 4 = 1000 kHz - ADC2->CR1 = 3 <<4; - #elif F_CPU >= 3000000 // 3 MHz / 3 = 1000 kHz - ADC2->CR1 = 2 <<4; - #elif F_CPU >= 2000000 // 2 MHz / 2 = 1000 kHz - ADC2->CR1 = 1 <<4; - //#else // minimum prescaler is 2, already set by ADC1_DeInit(); - // ADC2->CR1 = 0 <<4; - #endif - - #endif // ADC2 - -#endif // ifndef NO_ANALOG_IN - - // this needs to be called before setup() or some functions won't - // work there - enableInterrupts(); -} From 6fdb60a433c0a38ee736d7e719297db682dbb01b Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 13:18:32 +0100 Subject: [PATCH 22/59] prepare wiring_digital.c for splitting --- .../stm8/cores/sduino/wiring_digital-tables.c | 32 +++++++++++++++++++ .../sduino/stm8/cores/sduino/wiring_digital.c | 26 +++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital-tables.c diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital-tables.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital-tables.c new file mode 100644 index 00000000..aceb9d18 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital-tables.c @@ -0,0 +1,32 @@ +/* + wiring_digital.c - digital input and output functions + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + 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 + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + 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., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul +*/ + + +/* + * compile the tables from pins_arduino.h + * + */ +#define ARDUINO_MAIN +#include "wiring_private.h" +#include "pins_arduino.h" diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c index d732c398..6100ccf6 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c @@ -22,7 +22,6 @@ Modified 28 September 2010 by Mark Sproul */ -#define ARDUINO_MAIN #include "wiring_private.h" #include "pins_arduino.h" @@ -35,7 +34,15 @@ */ typedef unsigned char *uc_p; -/* timer capture/compare mode register to control PWM mode */ +extern const uc_p ccmrx[NUM_TIMERS]; +extern const uc_p ccerx[NUM_TIMERS]; +extern const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]; +void turnOffPWM(uint8_t timer); + + +/** + * timer capture/compare mode register to control PWM mode + */ const uc_p ccmrx[NUM_TIMERS]={ #ifdef NEED_TIMER_11_12 TIM1->CCMR1, /* for TIMER11 */ @@ -110,6 +117,9 @@ const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]={ }; +/** + * set the input or output mode of a pin + */ /* arduino-style pinMode void pinMode(uint8_t pin, uint8_t mode) { @@ -225,7 +235,11 @@ void pinMode(uint8_t pin, uint8_t mode) * * SDCC is really, really not good in optimizing its code. */ -static void turnOffPWM(uint8_t timer) + +/** + * handle the PWM pins + */ +void turnOffPWM(uint8_t timer) { // Output compare mode = 000: Frozen - The comparison between the output // compare register TIM1_CCR1 and the counter register TIM1_CNT has no @@ -237,6 +251,9 @@ static void turnOffPWM(uint8_t timer) } +/** + * set an output value for a pin + */ void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); @@ -263,6 +280,9 @@ void digitalWrite(uint8_t pin, uint8_t val) END_CRITICAL } +/** + * read a pin value + */ int digitalRead(uint8_t pin) { uint8_t timer = digitalPinToTimer(pin); From 4511c154265cf6b1d2751173bab187e1e2aa73f1 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 13:20:09 +0100 Subject: [PATCH 23/59] split wiring_digital.c --- .../sduino/stm8/cores/sduino/wiring_digital.c | 300 ------------------ .../stm8/cores/sduino/wiring_digital.c-1.c | 22 ++ .../stm8/cores/sduino/wiring_digital.c-2.c | 26 ++ .../stm8/cores/sduino/wiring_digital.c-3.c | 32 ++ .../stm8/cores/sduino/wiring_digital.c-4.c | 120 +++++++ .../stm8/cores/sduino/wiring_digital.c-5.c | 16 + .../stm8/cores/sduino/wiring_digital.c-6.c | 30 ++ .../stm8/cores/sduino/wiring_digital.c-7.c | 19 ++ .../stm8/cores/sduino/wiring_digital.c.h | 42 +++ 9 files changed, 307 insertions(+), 300 deletions(-) delete mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-1.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-2.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-3.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-5.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-6.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-7.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c.h diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c deleted file mode 100644 index 6100ccf6..00000000 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - wiring_digital.c - digital input and output functions - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - 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 - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - 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., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - Modified 28 September 2010 by Mark Sproul -*/ - -#include "wiring_private.h" -#include "pins_arduino.h" - - - -/* this typedef is a SDCC wordaround. - * Defining this a type instead of defining an array of (unsigned char *) - * keeps SDCC from storing the array in the xinit segment and copy it to RAM - * at runtime. - */ -typedef unsigned char *uc_p; - -extern const uc_p ccmrx[NUM_TIMERS]; -extern const uc_p ccerx[NUM_TIMERS]; -extern const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]; -void turnOffPWM(uint8_t timer); - - -/** - * timer capture/compare mode register to control PWM mode - */ -const uc_p ccmrx[NUM_TIMERS]={ -#ifdef NEED_TIMER_11_12 - TIM1->CCMR1, /* for TIMER11 */ - TIM1->CCMR2, /* for TIMER12 */ -#endif - TIM1->CCMR3, /* for TIMER13 */ - TIM1->CCMR4, /* for TIMER14 */ - TIM2->CCMR1, /* for TIMER21 */ - TIM2->CCMR2, /* for TIMER22 */ -#ifdef NEED_TIMER_23 - TIM2->CCMR3, /* for TIMER23 */ -#endif -#ifdef NEED_TIMER_31_32 - TIM3->CCMR1, /* for TIMER31 */ - TIM3->CCMR2 /* for TIMER32 */ -#endif -}; - -/** - * CCER register for each timer channel. - * - * Each 8-bit-register can contain the bits for two channels, so in addition to - * the register address itself you also need the individual offset(s) of the - * bit(s) you want to access. - */ -const uc_p ccerx[NUM_TIMERS]={ -#ifdef NEED_TIMER_11_12 - TIM1->CCER1, /* for TIMER11 */ - TIM1->CCER1, /* for TIMER12 */ -#endif - TIM1->CCER2, /* for TIMER13 */ - TIM1->CCER2, /* for TIMER14 */ - TIM2->CCER1, /* for TIMER21 */ - TIM2->CCER1, /* for TIMER22 */ -#ifdef NEED_TIMER_23 - TIM2->CCER2, /* for TIMER23 */ -#endif -#ifdef NEED_TIMER_31_32 - TIM3->CCER1, /* for TIMER31 */ - TIM3->CCER1 /* for TIMER32 */ -#endif -}; - -/** - * These Bits have to be set to 0 in the timer channel's CCER - * (Capture/compare enable register) to disable the output, so that the - * physical pin is not driven by the timer. - * - * @see - * RM0016 Reference Manual - * STM8S Series and STM8AF Series 8-bit microcontrollers - * DocID14587 Rev 14 (Oct 2017) - * Table 38. Output control for complementary OCi and OCiN channels with break - * feature - */ -const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]={ -#ifdef NEED_TIMER_11_12 - (1 << 0) | (1 << 2), /* for TIMER11 */ - (1 << 4) | (1 << 6), /* for TIMER12 */ -#endif - (1 << 0) | (1 << 2), /* for TIMER13 */ - (1 << 4), /* for TIMER14 */ - (1 << 0), /* for TIMER21 */ - (1 << 4), /* for TIMER22 */ -#ifdef NEED_TIMER_23 - (1 << 0), /* for TIMER23 */ -#endif -#ifdef NEED_TIMER_31_32 - (1 << 0), /* for TIMER31 */ - (1 << 4) /* for TIMER32 */ -#endif -}; - - -/** - * set the input or output mode of a pin - */ -/* arduino-style pinMode -void pinMode(uint8_t pin, uint8_t mode) -{ - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - volatile uint8_t *reg, *out; - - if (port == NOT_A_PIN) return; - - reg = portModeRegister(port); - out = portOutputRegister(port); - - if (mode == INPUT) { - BEGIN_CRITICAL - *reg &= ~bit; - *out &= ~bit; - END_CRITICAL - } else if (mode == INPUT_PULLUP) { - BEGIN_CRITICAL - *reg &= ~bit; - *out |= bit; - END_CRITICAL - } else { - BEGIN_CRITICAL - *reg |= bit; - END_CRITICAL - } -} -*/ - -void pinMode(uint8_t pin, uint8_t mode) -{ - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - volatile GPIO_TypeDef *gpio; - - if (port == NOT_A_PIN) return; - - gpio = (GPIO_TypeDef *) portOutputRegister(port); - - if (mode == INPUT) { - BEGIN_CRITICAL - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->CR1 &= ~bit; // release top side - gpio->DDR &= ~bit; // now set direction - END_CRITICAL - } else if (mode == INPUT_PULLUP) { - BEGIN_CRITICAL - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->DDR &= ~bit; // set direction before - gpio->CR1 |= bit; // activating the pull up - END_CRITICAL - } else if (mode == OUTPUT_FAST) {// output push-pull, fast - BEGIN_CRITICAL - gpio->CR1 |= bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - END_CRITICAL - } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast - BEGIN_CRITICAL - gpio->CR1 &= ~bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - END_CRITICAL - } else if (mode == OUTPUT_OD) { // output open drain, slow - BEGIN_CRITICAL - gpio->CR1 &= ~bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - END_CRITICAL - } else { // output push-pull, slow - BEGIN_CRITICAL - gpio->CR1 |= bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - END_CRITICAL - } -} - -/* using an array of pointers compiles way more efficient than doing simple - * pointer arithmetics like - * - if (timerCCMR1 + (timer-TIMER11)) &= 0x8f; - } else { - *(&TIM2->CCMR1 + (timer-TIMER21)) &= 0x8f; - } - * - * or a simple switch/case statement like - * - switch (timer) - { - case TIMER11: TIM1->CCMR1 &= 0x8f; break; - case TIMER12: TIM1->CCMR2 &= 0x8f; break; - case TIMER13: TIM1->CCMR3 &= 0x8f; break; - case TIMER14: TIM1->CCMR4 &= 0x8f; break; - case TIMER21: TIM2->CCMR1 &= 0x8f; break; - case TIMER22: TIM2->CCMR2 &= 0x8f; break; - case TIMER23: TIM2->CCMR3 &= 0x8f; break; - } - * - * The most efficient way is this: - * -#define T1_BASE 0x5258 -#define T2_BASE 0x5307 - uint8_t *reg = T1_BASE-1; - if (timer>4) reg+= (T2_BASE - T1_BASE); - reg[timer] &= ~TIM1_CCMR_OCM; - * - * Unfortunatly, SDCC can't figure out the values TIM1->CCMR1 und TIM->CCMR2 - * early enough in the compile process, so the adresses have to be hardcoded - * into the code. - * - * SDCC is really, really not good in optimizing its code. - */ - -/** - * handle the PWM pins - */ -void turnOffPWM(uint8_t timer) -{ - // Output compare mode = 000: Frozen - The comparison between the output - // compare register TIM1_CCR1 and the counter register TIM1_CNT has no - // effect on the outputs. - *((unsigned char *) ccmrx[timer-1]) &= ~TIM1_CCMR_OCM; - - // CCiE = CCiNE = 0: Output disabled (not driven by the timer) - *((unsigned char *) ccerx[timer-1]) &=~ (DISABLE_TIMER_OUTP_MASK[timer-1]); -} - - -/** - * set an output value for a pin - */ -void digitalWrite(uint8_t pin, uint8_t val) -{ - uint8_t timer = digitalPinToTimer(pin); - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - volatile uint8_t *out; - - if (port == NOT_A_PIN) return; - - // If the pin that support PWM output, we need to turn it off - // before doing a digital write. - if (timer != NOT_ON_TIMER) turnOffPWM(timer); - - out = portOutputRegister(port); - - BEGIN_CRITICAL - - if (val == LOW) { - *out &= ~bit; - } else { - *out |= bit; - } - - END_CRITICAL -} - -/** - * read a pin value - */ -int digitalRead(uint8_t pin) -{ - uint8_t timer = digitalPinToTimer(pin); - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - - if (port == NOT_A_PIN) return LOW; - - // If the pin that support PWM output, we need to turn it off - // before getting a digital reading. - if (timer != NOT_ON_TIMER) turnOffPWM(timer); - - if (*portInputRegister(port) & bit) return HIGH; - return LOW; -} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-1.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-1.c new file mode 100644 index 00000000..1dcd9362 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-1.c @@ -0,0 +1,22 @@ +#include "wiring_digital.c.h" +/** + * timer capture/compare mode register to control PWM mode + */ +const uc_p ccmrx[NUM_TIMERS]={ +#ifdef NEED_TIMER_11_12 + TIM1->CCMR1, /* for TIMER11 */ + TIM1->CCMR2, /* for TIMER12 */ +#endif + TIM1->CCMR3, /* for TIMER13 */ + TIM1->CCMR4, /* for TIMER14 */ + TIM2->CCMR1, /* for TIMER21 */ + TIM2->CCMR2, /* for TIMER22 */ +#ifdef NEED_TIMER_23 + TIM2->CCMR3, /* for TIMER23 */ +#endif +#ifdef NEED_TIMER_31_32 + TIM3->CCMR1, /* for TIMER31 */ + TIM3->CCMR2 /* for TIMER32 */ +#endif +}; + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-2.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-2.c new file mode 100644 index 00000000..55c5bca1 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-2.c @@ -0,0 +1,26 @@ +#include "wiring_digital.c.h" +/** + * CCER register for each timer channel. + * + * Each 8-bit-register can contain the bits for two channels, so in addition to + * the register address itself you also need the individual offset(s) of the + * bit(s) you want to access. + */ +const uc_p ccerx[NUM_TIMERS]={ +#ifdef NEED_TIMER_11_12 + TIM1->CCER1, /* for TIMER11 */ + TIM1->CCER1, /* for TIMER12 */ +#endif + TIM1->CCER2, /* for TIMER13 */ + TIM1->CCER2, /* for TIMER14 */ + TIM2->CCER1, /* for TIMER21 */ + TIM2->CCER1, /* for TIMER22 */ +#ifdef NEED_TIMER_23 + TIM2->CCER2, /* for TIMER23 */ +#endif +#ifdef NEED_TIMER_31_32 + TIM3->CCER1, /* for TIMER31 */ + TIM3->CCER1 /* for TIMER32 */ +#endif +}; + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-3.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-3.c new file mode 100644 index 00000000..becb5a4e --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-3.c @@ -0,0 +1,32 @@ +#include "wiring_digital.c.h" +/** + * These Bits have to be set to 0 in the timer channel's CCER + * (Capture/compare enable register) to disable the output, so that the + * physical pin is not driven by the timer. + * + * @see + * RM0016 Reference Manual + * STM8S Series and STM8AF Series 8-bit microcontrollers + * DocID14587 Rev 14 (Oct 2017) + * Table 38. Output control for complementary OCi and OCiN channels with break + * feature + */ +const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]={ +#ifdef NEED_TIMER_11_12 + (1 << 0) | (1 << 2), /* for TIMER11 */ + (1 << 4) | (1 << 6), /* for TIMER12 */ +#endif + (1 << 0) | (1 << 2), /* for TIMER13 */ + (1 << 4), /* for TIMER14 */ + (1 << 0), /* for TIMER21 */ + (1 << 4), /* for TIMER22 */ +#ifdef NEED_TIMER_23 + (1 << 0), /* for TIMER23 */ +#endif +#ifdef NEED_TIMER_31_32 + (1 << 0), /* for TIMER31 */ + (1 << 4) /* for TIMER32 */ +#endif +}; + + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c new file mode 100644 index 00000000..483bd0a3 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c @@ -0,0 +1,120 @@ +#include "wiring_digital.c.h" +/** + * set the input or output mode of a pin + */ +/* arduino-style pinMode +void pinMode(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *reg, *out; + + if (port == NOT_A_PIN) return; + + reg = portModeRegister(port); + out = portOutputRegister(port); + + if (mode == INPUT) { + BEGIN_CRITICAL + *reg &= ~bit; + *out &= ~bit; + END_CRITICAL + } else if (mode == INPUT_PULLUP) { + BEGIN_CRITICAL + *reg &= ~bit; + *out |= bit; + END_CRITICAL + } else { + BEGIN_CRITICAL + *reg |= bit; + END_CRITICAL + } +} +*/ + +void pinMode(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile GPIO_TypeDef *gpio; + + if (port == NOT_A_PIN) return; + + gpio = (GPIO_TypeDef *) portOutputRegister(port); + + if (mode == INPUT) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->CR1 &= ~bit; // release top side + gpio->DDR &= ~bit; // now set direction + END_CRITICAL + } else if (mode == INPUT_PULLUP) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->DDR &= ~bit; // set direction before + gpio->CR1 |= bit; // activating the pull up + END_CRITICAL + } else if (mode == OUTPUT_FAST) {// output push-pull, fast + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD) { // output open drain, slow + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } else { // output push-pull, slow + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } +} + +/* using an array of pointers compiles way more efficient than doing simple + * pointer arithmetics like + * + if (timerCCMR1 + (timer-TIMER11)) &= 0x8f; + } else { + *(&TIM2->CCMR1 + (timer-TIMER21)) &= 0x8f; + } + * + * or a simple switch/case statement like + * + switch (timer) + { + case TIMER11: TIM1->CCMR1 &= 0x8f; break; + case TIMER12: TIM1->CCMR2 &= 0x8f; break; + case TIMER13: TIM1->CCMR3 &= 0x8f; break; + case TIMER14: TIM1->CCMR4 &= 0x8f; break; + case TIMER21: TIM2->CCMR1 &= 0x8f; break; + case TIMER22: TIM2->CCMR2 &= 0x8f; break; + case TIMER23: TIM2->CCMR3 &= 0x8f; break; + } + * + * The most efficient way is this: + * +#define T1_BASE 0x5258 +#define T2_BASE 0x5307 + uint8_t *reg = T1_BASE-1; + if (timer>4) reg+= (T2_BASE - T1_BASE); + reg[timer] &= ~TIM1_CCMR_OCM; + * + * Unfortunatly, SDCC can't figure out the values TIM1->CCMR1 und TIM->CCMR2 + * early enough in the compile process, so the adresses have to be hardcoded + * into the code. + * + * SDCC is really, really not good in optimizing its code. + */ + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-5.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-5.c new file mode 100644 index 00000000..3f8b10a7 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-5.c @@ -0,0 +1,16 @@ +#include "wiring_digital.c.h" +/** + * handle the PWM pins + */ +void turnOffPWM(uint8_t timer) +{ + // Output compare mode = 000: Frozen - The comparison between the output + // compare register TIM1_CCR1 and the counter register TIM1_CNT has no + // effect on the outputs. + *((unsigned char *) ccmrx[timer-1]) &= ~TIM1_CCMR_OCM; + + // CCiE = CCiNE = 0: Output disabled (not driven by the timer) + *((unsigned char *) ccerx[timer-1]) &=~ (DISABLE_TIMER_OUTP_MASK[timer-1]); +} + + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-6.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-6.c new file mode 100644 index 00000000..1bbaee1c --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-6.c @@ -0,0 +1,30 @@ +#include "wiring_digital.c.h" +/** + * set an output value for a pin + */ +void digitalWrite(uint8_t pin, uint8_t val) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *out; + + if (port == NOT_A_PIN) return; + + // If the pin that support PWM output, we need to turn it off + // before doing a digital write. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + out = portOutputRegister(port); + + BEGIN_CRITICAL + + if (val == LOW) { + *out &= ~bit; + } else { + *out |= bit; + } + + END_CRITICAL +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-7.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-7.c new file mode 100644 index 00000000..f3425613 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-7.c @@ -0,0 +1,19 @@ +#include "wiring_digital.c.h" +/** + * read a pin value + */ +int digitalRead(uint8_t pin) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + + if (port == NOT_A_PIN) return LOW; + + // If the pin that support PWM output, we need to turn it off + // before getting a digital reading. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + if (*portInputRegister(port) & bit) return HIGH; + return LOW; +} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c.h b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c.h new file mode 100644 index 00000000..3f650955 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c.h @@ -0,0 +1,42 @@ +/* + wiring_digital.c - digital input and output functions + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + 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 + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + 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., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + + + +/* this typedef is a SDCC wordaround. + * Defining this a type instead of defining an array of (unsigned char *) + * keeps SDCC from storing the array in the xinit segment and copy it to RAM + * at runtime. + */ +typedef unsigned char *uc_p; + +extern const uc_p ccmrx[NUM_TIMERS]; +extern const uc_p ccerx[NUM_TIMERS]; +extern const unsigned char DISABLE_TIMER_OUTP_MASK[NUM_TIMERS]; +void turnOffPWM(uint8_t timer); + + From 3bf47f1f7cb2302bb55769c2ef36682b9fb299ef Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 13:34:44 +0100 Subject: [PATCH 24/59] use xmacro definitions for the Print methods in HardwareSerial --- .../sduino/stm8/cores/sduino/HardwareSerial.h | 41 ++++++------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.h b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.h index 1ac29169..7f61fc67 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.h +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.h @@ -71,9 +71,17 @@ void HardwareSerial_flush(void); void HardwareSerial_end(void); -// Alias Definitions for a more Arduino-like look //////////////////////////// +// Pseudo-OO interface: Plain C disguised as almost-C++, thanks to X-Macros +// +// We want to "inherit" the output functions from Print, so include that +// header file as well before we start calling any macros. + +#include +#include + + +// Since this is (so far) a singleton class, simple #define statement will work -#define Serial HardwareSerial() #define Serial_begin HardwareSerial_begin #define Serial_begin_config HardwareSerial_begin_config #define Serial_available HardwareSerial_available @@ -83,33 +91,8 @@ void HardwareSerial_end(void); #define Serial_end HardwareSerial_end -// variants of the standard Serial.print() function: Separate implementations -// for string, char, unsigned, signed int -#define Serial_print_s(S) Print_print_s(HardwareSerial_write,S) -#define Serial_print_sn(S,N) Print_print_sn(HardwareSerial_write,S,N) -#define Serial_print_c(C) HardwareSerial_write(C) - -// print signed/unsigned integer values (char, short, int, long) as decimal values -#define Serial_print_i(I) Print_print_i(HardwareSerial_write,I) -#define Serial_print_u(U) Print_print_u(HardwareSerial_write,U) - -// print signed/unsigned integer values (char, short, int, long) to base B -#define Serial_print_ib(I,B) Print_print_ib(HardwareSerial_write,I,B) -#define Serial_print_ub(U,B) Print_print_ub(HardwareSerial_write,U,B) - -// print float value -#define Serial_print_f(F) Print_print_fd(HardwareSerial_write,F,2) -#define Serial_print_fd(F,D) Print_print_fd(HardwareSerial_write,F,D) - -#define Serial_println() Print_println(HardwareSerial_write) -#define Serial_println_s(S) Print_println_s(HardwareSerial_write,S) -#define Serial_println_sn(S,N) Print_println_sn(HardwareSerial_write,S,N) -#define Serial_println_u(U) Print_println_u(HardwareSerial_write,U) -#define Serial_println_i(I) Print_println_i(HardwareSerial_write,I) -#define Serial_println_ib(I,B) Print_println_ib(HardwareSerial_write,I,B) -#define Serial_println_ub(U,B) Print_println_ub(HardwareSerial_write,U,B) -#define Serial_println_f(F) Print_println_fd(HardwareSerial_write,F,2) -#define Serial_println_fd(F,D) Print_println_fd(HardwareSerial_write,F,D) +// "inherit" all print methods from the Print "class" +XPrintMethods (HardwareSerial,Serial) #endif From c5c23e29154b165012b1312201d3b6fae3c02994 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 14:15:13 +0100 Subject: [PATCH 25/59] prepare HardwareSerial.c for splitting --- .../sduino/stm8/cores/sduino/HardwareSerial.c | 75 ++++++++++++++----- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c index a46dbd4b..2c40d81c 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c @@ -107,32 +107,57 @@ #endif +// private data ////////////////////////////////////////////////////////////// + +#define SERIAL_BUFFER_SIZE 16 +typedef struct ring_buffer +{ + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile unsigned int head; + volatile unsigned int tail; +} ring_buffer; + + +extern ring_buffer rx_buffer;// = { { 0 }, 0, 0}; +extern ring_buffer tx_buffer;// = { { 0 }, 0, 0}; + +extern volatile char transmitting;//=0; +extern unsigned char initialized;//=0 internal status. Returned on HardwareSerial() + + + +/** + * This part contains the bare minimum of serial support functions + * + * The interrupt functions (and the supporting basic data structures) can't + * be removed by the linker, even if no serial functions are used in the sketch. + * + * Add a "-DNO_SERIAL" to the CPPFLAGS or CFLAGS to full remove this code. + */ + #ifdef NO_SERIAL /* * empty default IRQ functions to make the linker happy if the * respective module is not to linked. */ -void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX){} void UARTx_RX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_RX){} -#else // ifdef NO_SERIAL +void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX){} +#else // ifdef NO_SERIAL // private data ////////////////////////////////////////////////////////////// -#define SERIAL_BUFFER_SIZE 16 -typedef struct ring_buffer -{ - unsigned char buffer[SERIAL_BUFFER_SIZE]; - volatile unsigned int head; - volatile unsigned int tail; -} ring_buffer; +// These variables should be static, but that doesn't go together with +// splitting the source code into smaller units. + +ring_buffer rx_buffer;// = { { 0 }, 0, 0}; +ring_buffer tx_buffer;// = { { 0 }, 0, 0}; + +volatile char transmitting;//=0; +unsigned char initialized;//=0 internal status. Returned on HardwareSerial() -static ring_buffer rx_buffer;// = { { 0 }, 0, 0}; -static ring_buffer tx_buffer;// = { { 0 }, 0, 0}; -static volatile char transmitting;//=0; -static unsigned char initialized;//=0 internal status. Returned on HardwareSerial() // private functions //////////////////////////////////////////////////////// @@ -203,15 +228,19 @@ void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX) /* UART1/2 TX */ } #endif } +#endif // ifdef NO_SERIAL // Public Methods ////////////////////////////////////////////////////////////// +/** + */ uint8_t HardwareSerial(void) { return initialized; } - +/** + */ void HardwareSerial_begin(unsigned long baud) { #ifdef USE_SPL @@ -242,7 +271,8 @@ void HardwareSerial_begin(unsigned long baud) runSerialEvent = 0; } - +/** + */ void HardwareSerial_begin_config(unsigned long baud, uint8_t config) { #ifdef USE_SPL @@ -283,7 +313,8 @@ void HardwareSerial_begin_config(unsigned long baud, uint8_t config) runSerialEvent = 0; } - +/** + */ void HardwareSerial_end(void) { // wait for transmission of outgoing data @@ -298,11 +329,15 @@ void HardwareSerial_end(void) runSerialEvent = 0; } +/** + */ int HardwareSerial_available(void) { return (unsigned int)(SERIAL_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % SERIAL_BUFFER_SIZE; } +/** + */ int HardwareSerial_peek(void) { if (rx_buffer.head == rx_buffer.tail) { @@ -313,6 +348,8 @@ int HardwareSerial_peek(void) } } +/** + */ int HardwareSerial_read(void) { // if the head isn't ahead of the tail, we don't have any characters @@ -327,6 +364,8 @@ int HardwareSerial_read(void) } } +/** + */ void HardwareSerial_flush(void) { // UDR is kept full while the buffer is not empty, so TXC triggers when @@ -342,6 +381,8 @@ void HardwareSerial_flush(void) transmitting = 0; } +/** + */ size_t HardwareSerial_write(uint8_t c) { int i = (tx_buffer.head + 1) % SERIAL_BUFFER_SIZE; @@ -368,5 +409,3 @@ size_t HardwareSerial_write(uint8_t c) return 1; } - -#endif // ifdef NO_SERIAL From cdfb50d4d85bdbe0ec17615e9dd580b84d81e029 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 8 Jan 2019 14:16:42 +0100 Subject: [PATCH 26/59] split HardwareSerial.c size of Blink.ino before split: 2519 after split: 1937 --- .../sduino/stm8/cores/sduino/HardwareSerial.c | 411 ------------------ .../stm8/cores/sduino/HardwareSerial.c-1.c | 107 +++++ .../stm8/cores/sduino/HardwareSerial.c-10.c | 29 ++ .../stm8/cores/sduino/HardwareSerial.c-2.c | 8 + .../stm8/cores/sduino/HardwareSerial.c-3.c | 33 ++ .../stm8/cores/sduino/HardwareSerial.c-4.c | 43 ++ .../stm8/cores/sduino/HardwareSerial.c-5.c | 17 + .../stm8/cores/sduino/HardwareSerial.c-6.c | 8 + .../stm8/cores/sduino/HardwareSerial.c-7.c | 13 + .../stm8/cores/sduino/HardwareSerial.c-8.c | 17 + .../stm8/cores/sduino/HardwareSerial.c-9.c | 18 + .../stm8/cores/sduino/HardwareSerial.c.h | 128 ++++++ 12 files changed, 421 insertions(+), 411 deletions(-) delete mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-1.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-10.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-2.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-3.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-4.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-5.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-6.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-7.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-8.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-9.c create mode 100644 sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c.h diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c deleted file mode 100644 index 2c40d81c..00000000 --- a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c +++ /dev/null @@ -1,411 +0,0 @@ -/* - HardwareSerial.c - Hardware serial library for sduino - Copyright (c) 2016 Michael Mayer - - Plain C version of HardwareSerial.cpp of the Arduino project. - Copyright (c) 2006 Nicholas Zambetti. All right reserved. - - 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 - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - 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 - - Modified 23 November 2006 by David A. Mellis - Modified 28 September 2010 by Mark Sproul - Modified 14 August 2012 by Alarus - Modified 15 December 2016 by Michael Mayer -*/ - - -#include"stm8s.h" - -#include "Arduino.h" -#include "HardwareSerial.h" - - -// device dependent definitions //////////////////////////////////////////// - -#if defined(UART1) -#warning "using uart1 for HardwareSerial" -# define UARTx UART1 -# define UARTx_RX_IRQHandler UART1_RX_IRQHandler -# define ITC_IRQ_UARTx_RX ITC_IRQ_UART1_RX -# define UARTx_TX_IRQHandler UART1_TX_IRQHandler -# define ITC_IRQ_UARTx_TX ITC_IRQ_UART1_TX -# define UARTx_CR2_TIEN UART1_CR2_TIEN -# define UARTx_CR2_RIEN UART1_CR2_RIEN -# define UARTx_CR2_TEN UART1_CR2_TEN -# define UARTx_CR2_REN UART1_CR2_REN -# define UARTx_FLAG_PE UART1_FLAG_PE -# define UARTx_FLAG_TC UART1_FLAG_TC -# define UARTx_DeInit UART1_DeInit -# ifdef USE_SPL -# define UARTx_ReceiveData8 UART1_ReceiveData8 -# define UARTx_GetFlagStatus UART1_GetFlagStatus -# define UARTx_ITConfig UART1_ITConfig -# define UARTx_Init UART1_Init -# define UARTx_IT_TXE UART1_IT_TXE -# define UARTx_IT_RXNE UART1_IT_RXNE -# define UARTx_WORDLENGTH_8D UART1_WORDLENGTH_8D -# define UARTx_WORDLENGTH_9D UART1_WORDLENGTH_9D -# define UARTx_STOPBITS_1 UART1_STOPBITS_1 -# define UARTx_STOPBITS_2 UART1_STOPBITS_2 -# define UARTx_SYNCMODE_CLOCK_DISABLE UART1_SYNCMODE_CLOCK_DISABLE -# define UARTx_MODE_TXRX_ENABLE UART1_MODE_TXRX_ENABLE -# define UARTx_PARITY_NO UART1_PARITY_NO -# define UARTx_PARITY_EVEN UART1_PARITY_EVEN -# define UARTx_PARITY_ODD UART1_PARITY_ODD -# define UARTx_StopBits_TypeDef UART1_StopBits_TypeDef -# define UARTx_Parity_TypeDef UART1_Parity_TypeDef -# define UARTx_WordLength_TypeDef UART1_WordLength_TypeDef -# endif -#elif defined(UART2) -#warning "using uart2 for HardwareSerial" -# define UARTx UART2 -# define UARTx_RX_IRQHandler UART2_RX_IRQHandler -# define ITC_IRQ_UARTx_RX ITC_IRQ_UART2_RX -# define UARTx_TX_IRQHandler UART2_TX_IRQHandler -# define ITC_IRQ_UARTx_TX ITC_IRQ_UART2_TX -# define UARTx_CR2_TIEN UART2_CR2_TIEN -# define UARTx_CR2_RIEN UART2_CR2_RIEN -# define UARTx_CR2_TEN UART2_CR2_TEN -# define UARTx_CR2_REN UART2_CR2_REN -# define UARTx_FLAG_PE UART2_FLAG_PE -# define UARTx_FLAG_TC UART2_FLAG_TC -# define UARTx_DeInit UART2_DeInit -# ifdef USE_SPL -# define UARTx_ReceiveData8 UART2_ReceiveData8 -# define UARTx_GetFlagStatus UART2_GetFlagStatus -# define UARTx_ITConfig UART2_ITConfig -# define UARTx_Init UART2_Init -# define UARTx_IT_TXE UART2_IT_TXE -# define UARTx_IT_RXNE UART2_IT_RXNE -# define UARTx_WORDLENGTH_8D UART2_WORDLENGTH_8D -# define UARTx_WORDLENGTH_9D UART2_WORDLENGTH_9D -# define UARTx_STOPBITS_1 UART2_STOPBITS_1 -# define UARTx_STOPBITS_2 UART2_STOPBITS_2 -# define UARTx_SYNCMODE_CLOCK_DISABLE UART2_SYNCMODE_CLOCK_DISABLE -# define UARTx_MODE_TXRX_ENABLE UART2_MODE_TXRX_ENABLE -# define UARTx_PARITY_NO UART2_PARITY_NO -# define UARTx_PARITY_EVEN UART2_PARITY_EVEN -# define UARTx_PARITY_ODD UART2_PARITY_ODD -# define UARTx_StopBits_TypeDef UART2_StopBits_TypeDef -# define UARTx_Parity_TypeDef UART2_Parity_TypeDef -# define UARTx_WordLength_TypeDef UART2_WordLength_TypeDef -# endif -#else -# error "no UART definition found." -#endif - - -// private data ////////////////////////////////////////////////////////////// - -#define SERIAL_BUFFER_SIZE 16 -typedef struct ring_buffer -{ - unsigned char buffer[SERIAL_BUFFER_SIZE]; - volatile unsigned int head; - volatile unsigned int tail; -} ring_buffer; - - -extern ring_buffer rx_buffer;// = { { 0 }, 0, 0}; -extern ring_buffer tx_buffer;// = { { 0 }, 0, 0}; - -extern volatile char transmitting;//=0; -extern unsigned char initialized;//=0 internal status. Returned on HardwareSerial() - - - -/** - * This part contains the bare minimum of serial support functions - * - * The interrupt functions (and the supporting basic data structures) can't - * be removed by the linker, even if no serial functions are used in the sketch. - * - * Add a "-DNO_SERIAL" to the CPPFLAGS or CFLAGS to full remove this code. - */ - -#ifdef NO_SERIAL -/* - * empty default IRQ functions to make the linker happy if the - * respective module is not to linked. - */ - -void UARTx_RX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_RX){} -void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX){} - -#else // ifdef NO_SERIAL - -// private data ////////////////////////////////////////////////////////////// - -// These variables should be static, but that doesn't go together with -// splitting the source code into smaller units. - -ring_buffer rx_buffer;// = { { 0 }, 0, 0}; -ring_buffer tx_buffer;// = { { 0 }, 0, 0}; - -volatile char transmitting;//=0; -unsigned char initialized;//=0 internal status. Returned on HardwareSerial() - - - -// private functions //////////////////////////////////////////////////////// - -static void store_char(unsigned char c, ring_buffer *buffer) -//inline void store_char(unsigned char c, ring_buffer *buffer) -{ - int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != buffer->tail) { - buffer->buffer[buffer->head] = c; - buffer->head = i; - runSerialEvent = 1; - } -} - -// Interrupt handler /////////////////////////////////////////////////////////// - -void UARTx_RX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_RX) /* UART1/2 RX */ -{ - unsigned char c; - -#ifdef USE_SPL - c = UARTx_ReceiveData8(); - // check for parity error - if (!UARTx_GetFlagStatus(UARTx_FLAG_PE)) { -#else - c = UARTx->DR; - // check for parity error - if (!(UARTx->SR & UARTx_FLAG_PE)) { -#endif - // no parity error, so store the data - store_char(c, &rx_buffer); - }; -} - - -void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX) /* UART1/2 TX */ -{ -#ifdef USE_SPL - if (tx_buffer.head == tx_buffer.tail) { - // Buffer empty, so disable interrupts - transmitting = 0; - UARTx_ITConfig(UARTx_IT_TXE, DISABLE); - } - else { - // There is more data in the output buffer. Send the next byte - unsigned char c = tx_buffer.buffer[tx_buffer.tail]; - tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; - - UARTx_SendData8(c); - } -#else - if (tx_buffer.head == tx_buffer.tail) { - // Buffer empty, so disable interrupts - transmitting = 0; - UARTx->CR2 &= ~UARTx_CR2_TIEN; - } - else { - // There is more data in the output buffer. Send the next byte - unsigned char c = tx_buffer.buffer[tx_buffer.tail]; - tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; - - UARTx->DR = c; - } -#endif -} -#endif // ifdef NO_SERIAL - -// Public Methods ////////////////////////////////////////////////////////////// - -/** - */ -uint8_t HardwareSerial(void) -{ - return initialized; -} - -/** - */ -void HardwareSerial_begin(unsigned long baud) -{ -#ifdef USE_SPL - //set the data bits, parity, and stop bits - UARTx_Init(baud, - UARTx_WORDLENGTH_8D, UARTx_STOPBITS_1, UARTx_PARITY_NO, - UARTx_SYNCMODE_CLOCK_DISABLE, UARTx_MODE_TXRX_ENABLE); - - UARTx_ITConfig(UARTx_IT_RXNE, ENABLE); // enable RXNE interrupt -#else - uint16_t divider; - - /* Set the UARTx BaudRates in BRR1 and BRR2 registers according to UARTx_BaudRate value */ - divider = (uint16_t) ((uint32_t)CLK_GetClockFreq() / (uint32_t) baud); - - UARTx->BRR2 = divider & 0x0f; - divider >>= 4; - UARTx->BRR1 = divider & 0xff; - divider >> 4; - UARTx->BRR2 |= (uint8_t) divider & 0xf0; - - UARTx->CR1 = 0; // 8 Bit, no parity - UARTx->CR3 = 0; // one stop bit - // enable RXNE interrupt, enable transmitter, enable receiver - UARTx->CR2 = UARTx_CR2_RIEN | UARTx_CR2_TEN | UARTx_CR2_REN; -#endif - initialized = 1; - runSerialEvent = 0; -} - -/** - */ -void HardwareSerial_begin_config(unsigned long baud, uint8_t config) -{ -#ifdef USE_SPL - UARTx_StopBits_TypeDef stopbits; - UARTx_Parity_TypeDef parity; - UARTx_WordLength_TypeDef wordlength; - - wordlength = (config & 0x10) ? UARTx_WORDLENGTH_9D : UARTx_WORDLENGTH_8D; - stopbits = (config & 0x20) ? UARTx_STOPBITS_2 : UARTx_STOPBITS_1; - parity=UARTx_PARITY_NO; // default - config &= 0x6; - if (config == 0x4) parity=UARTx_PARITY_EVEN; - else if (config == 0x6) parity=UARTx_PARITY_ODD; - - //set the data bits, parity, and stop bits - UARTx_Init(baud, wordlength, stopbits, parity, - UARTx_SYNCMODE_CLOCK_DISABLE, UARTx_MODE_TXRX_ENABLE); - - UARTx_ITConfig(UARTx_IT_RXNE, ENABLE); // enable RXNE interrupt -#else - uint16_t divider; - - /* Set the UARTx BaudRates in BRR1 and BRR2 registers according to UARTx_BaudRate value */ - divider = (uint16_t) ((uint32_t)CLK_GetClockFreq() / (uint32_t) baud); - - UARTx->BRR2 = divider & 0x0f; - divider >>= 4; - UARTx->BRR1 = divider & 0xff; - divider >> 4; - UARTx->BRR2 |= (uint8_t) divider & 0xf0; - - UARTx->CR1 = config & (MASK_DATABITS | MASK_PARITY); - UARTx->CR3 = config & (MASK_STOPBITS); - // enable RXNE interrupt, enable transmitter, enable receiver - UARTx->CR2 = UARTx_CR2_RIEN | UARTx_CR2_TEN | UARTx_CR2_REN; -#endif - initialized = 1; - runSerialEvent = 0; -} - -/** - */ -void HardwareSerial_end(void) -{ - // wait for transmission of outgoing data - while (tx_buffer.head != tx_buffer.tail) - ; - - UARTx_DeInit(); - - // clear any received data - rx_buffer.head = rx_buffer.tail; - initialized = 0; - runSerialEvent = 0; -} - -/** - */ -int HardwareSerial_available(void) -{ - return (unsigned int)(SERIAL_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % SERIAL_BUFFER_SIZE; -} - -/** - */ -int HardwareSerial_peek(void) -{ - if (rx_buffer.head == rx_buffer.tail) { -// if (!runSerialEvent) { - return -1; - } else { - return rx_buffer.buffer[rx_buffer.tail]; - } -} - -/** - */ -int HardwareSerial_read(void) -{ - // if the head isn't ahead of the tail, we don't have any characters - if (rx_buffer.head == rx_buffer.tail) { -// if (!runSerialEvent) { - return -1; - } else { - unsigned char c = rx_buffer.buffer[rx_buffer.tail]; - rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; - runSerialEvent = (rx_buffer.head != rx_buffer.tail); - return c; - } -} - -/** - */ -void HardwareSerial_flush(void) -{ - // UDR is kept full while the buffer is not empty, so TXC triggers when - // EMPTY && SENT - -// while (transmitting && ! (*_ucsra & _BV(TXC0))); -// while (transmitting && ! (UARTx_SR & UARTx_SR_TC)); -#ifdef USE_SPL - while (transmitting && ! UARTx_GetFlagStatus(UARTx_FLAG_TC)); -#else - while (transmitting && !(UARTx->SR & UARTx_FLAG_TC)); -#endif - transmitting = 0; -} - -/** - */ -size_t HardwareSerial_write(uint8_t c) -{ - int i = (tx_buffer.head + 1) % SERIAL_BUFFER_SIZE; - - // If the output buffer is full, there's nothing for it other than to - // wait for the interrupt handler to empty it a bit - // ???: return 0 here instead? - while (i == tx_buffer.tail) - ; - - tx_buffer.buffer[tx_buffer.head] = c; - tx_buffer.head = i; - -#ifdef USE_SPL - UARTx_ITConfig(UARTx_IT_TXE, ENABLE); // enable TXE interrupt -#else - UARTx->CR2 |= UARTx_CR2_TIEN; // enable TXE interrupt -#endif - transmitting = 1; - //FIXME: unklar, ob das auf dem STM8 wirklich nötig ist. - // Das TXE-Bit in UART_SR ist jedenfalls nur lesbar. - // clear the TXC bit -- "can be cleared by writing a one to its bit location" -// sbi(*_ucsra, TXC0); - - return 1; -} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-1.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-1.c new file mode 100644 index 00000000..355db9a4 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-1.c @@ -0,0 +1,107 @@ +#include "HardwareSerial.c.h" +/** + * This part contains the bare minimum of serial support functions + * + * The interrupt functions (and the supporting basic data structures) can't + * be removed by the linker, even if no serial functions are used in the sketch. + * + * Add a "-DNO_SERIAL" to the CPPFLAGS or CFLAGS to full remove this code. + */ + +#ifdef NO_SERIAL +/* + * empty default IRQ functions to make the linker happy if the + * respective module is not to linked. + */ + +void UARTx_RX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_RX){} +void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX){} + +#else // ifdef NO_SERIAL + +// private data ////////////////////////////////////////////////////////////// + +// These variables should be static, but that doesn't go together with +// splitting the source code into smaller units. + +ring_buffer rx_buffer;// = { { 0 }, 0, 0}; +ring_buffer tx_buffer;// = { { 0 }, 0, 0}; + +volatile char transmitting;//=0; +unsigned char initialized;//=0 internal status. Returned on HardwareSerial() + + + +// private functions //////////////////////////////////////////////////////// + +static void store_char(unsigned char c, ring_buffer *buffer) +//inline void store_char(unsigned char c, ring_buffer *buffer) +{ + int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != buffer->tail) { + buffer->buffer[buffer->head] = c; + buffer->head = i; + runSerialEvent = 1; + } +} + +// Interrupt handler /////////////////////////////////////////////////////////// + +void UARTx_RX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_RX) /* UART1/2 RX */ +{ + unsigned char c; + +#ifdef USE_SPL + c = UARTx_ReceiveData8(); + // check for parity error + if (!UARTx_GetFlagStatus(UARTx_FLAG_PE)) { +#else + c = UARTx->DR; + // check for parity error + if (!(UARTx->SR & UARTx_FLAG_PE)) { +#endif + // no parity error, so store the data + store_char(c, &rx_buffer); + }; +} + + +void UARTx_TX_IRQHandler(void) __interrupt(ITC_IRQ_UARTx_TX) /* UART1/2 TX */ +{ +#ifdef USE_SPL + if (tx_buffer.head == tx_buffer.tail) { + // Buffer empty, so disable interrupts + transmitting = 0; + UARTx_ITConfig(UARTx_IT_TXE, DISABLE); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer.buffer[tx_buffer.tail]; + tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; + + UARTx_SendData8(c); + } +#else + if (tx_buffer.head == tx_buffer.tail) { + // Buffer empty, so disable interrupts + transmitting = 0; + UARTx->CR2 &= ~UARTx_CR2_TIEN; + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer.buffer[tx_buffer.tail]; + tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; + + UARTx->DR = c; + } +#endif +} +#endif // ifdef NO_SERIAL + +// Public Methods ////////////////////////////////////////////////////////////// + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-10.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-10.c new file mode 100644 index 00000000..a12c467a --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-10.c @@ -0,0 +1,29 @@ +#include "HardwareSerial.c.h" +/** + */ +size_t HardwareSerial_write(uint8_t c) +{ + int i = (tx_buffer.head + 1) % SERIAL_BUFFER_SIZE; + + // If the output buffer is full, there's nothing for it other than to + // wait for the interrupt handler to empty it a bit + // ???: return 0 here instead? + while (i == tx_buffer.tail) + ; + + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + +#ifdef USE_SPL + UARTx_ITConfig(UARTx_IT_TXE, ENABLE); // enable TXE interrupt +#else + UARTx->CR2 |= UARTx_CR2_TIEN; // enable TXE interrupt +#endif + transmitting = 1; + //FIXME: unklar, ob das auf dem STM8 wirklich nötig ist. + // Das TXE-Bit in UART_SR ist jedenfalls nur lesbar. + // clear the TXC bit -- "can be cleared by writing a one to its bit location" +// sbi(*_ucsra, TXC0); + + return 1; +} diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-2.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-2.c new file mode 100644 index 00000000..fe74bde4 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-2.c @@ -0,0 +1,8 @@ +#include "HardwareSerial.c.h" +/** + */ +uint8_t HardwareSerial(void) +{ + return initialized; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-3.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-3.c new file mode 100644 index 00000000..9ecabdc0 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-3.c @@ -0,0 +1,33 @@ +#include "HardwareSerial.c.h" +/** + */ +void HardwareSerial_begin(unsigned long baud) +{ +#ifdef USE_SPL + //set the data bits, parity, and stop bits + UARTx_Init(baud, + UARTx_WORDLENGTH_8D, UARTx_STOPBITS_1, UARTx_PARITY_NO, + UARTx_SYNCMODE_CLOCK_DISABLE, UARTx_MODE_TXRX_ENABLE); + + UARTx_ITConfig(UARTx_IT_RXNE, ENABLE); // enable RXNE interrupt +#else + uint16_t divider; + + /* Set the UARTx BaudRates in BRR1 and BRR2 registers according to UARTx_BaudRate value */ + divider = (uint16_t) ((uint32_t)CLK_GetClockFreq() / (uint32_t) baud); + + UARTx->BRR2 = divider & 0x0f; + divider >>= 4; + UARTx->BRR1 = divider & 0xff; + divider >> 4; + UARTx->BRR2 |= (uint8_t) divider & 0xf0; + + UARTx->CR1 = 0; // 8 Bit, no parity + UARTx->CR3 = 0; // one stop bit + // enable RXNE interrupt, enable transmitter, enable receiver + UARTx->CR2 = UARTx_CR2_RIEN | UARTx_CR2_TEN | UARTx_CR2_REN; +#endif + initialized = 1; + runSerialEvent = 0; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-4.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-4.c new file mode 100644 index 00000000..f3d9cf98 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-4.c @@ -0,0 +1,43 @@ +#include "HardwareSerial.c.h" +/** + */ +void HardwareSerial_begin_config(unsigned long baud, uint8_t config) +{ +#ifdef USE_SPL + UARTx_StopBits_TypeDef stopbits; + UARTx_Parity_TypeDef parity; + UARTx_WordLength_TypeDef wordlength; + + wordlength = (config & 0x10) ? UARTx_WORDLENGTH_9D : UARTx_WORDLENGTH_8D; + stopbits = (config & 0x20) ? UARTx_STOPBITS_2 : UARTx_STOPBITS_1; + parity=UARTx_PARITY_NO; // default + config &= 0x6; + if (config == 0x4) parity=UARTx_PARITY_EVEN; + else if (config == 0x6) parity=UARTx_PARITY_ODD; + + //set the data bits, parity, and stop bits + UARTx_Init(baud, wordlength, stopbits, parity, + UARTx_SYNCMODE_CLOCK_DISABLE, UARTx_MODE_TXRX_ENABLE); + + UARTx_ITConfig(UARTx_IT_RXNE, ENABLE); // enable RXNE interrupt +#else + uint16_t divider; + + /* Set the UARTx BaudRates in BRR1 and BRR2 registers according to UARTx_BaudRate value */ + divider = (uint16_t) ((uint32_t)CLK_GetClockFreq() / (uint32_t) baud); + + UARTx->BRR2 = divider & 0x0f; + divider >>= 4; + UARTx->BRR1 = divider & 0xff; + divider >> 4; + UARTx->BRR2 |= (uint8_t) divider & 0xf0; + + UARTx->CR1 = config & (MASK_DATABITS | MASK_PARITY); + UARTx->CR3 = config & (MASK_STOPBITS); + // enable RXNE interrupt, enable transmitter, enable receiver + UARTx->CR2 = UARTx_CR2_RIEN | UARTx_CR2_TEN | UARTx_CR2_REN; +#endif + initialized = 1; + runSerialEvent = 0; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-5.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-5.c new file mode 100644 index 00000000..e58c62ee --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-5.c @@ -0,0 +1,17 @@ +#include "HardwareSerial.c.h" +/** + */ +void HardwareSerial_end(void) +{ + // wait for transmission of outgoing data + while (tx_buffer.head != tx_buffer.tail) + ; + + UARTx_DeInit(); + + // clear any received data + rx_buffer.head = rx_buffer.tail; + initialized = 0; + runSerialEvent = 0; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-6.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-6.c new file mode 100644 index 00000000..0a4fd525 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-6.c @@ -0,0 +1,8 @@ +#include "HardwareSerial.c.h" +/** + */ +int HardwareSerial_available(void) +{ + return (unsigned int)(SERIAL_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % SERIAL_BUFFER_SIZE; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-7.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-7.c new file mode 100644 index 00000000..c310b192 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-7.c @@ -0,0 +1,13 @@ +#include "HardwareSerial.c.h" +/** + */ +int HardwareSerial_peek(void) +{ + if (rx_buffer.head == rx_buffer.tail) { +// if (!runSerialEvent) { + return -1; + } else { + return rx_buffer.buffer[rx_buffer.tail]; + } +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-8.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-8.c new file mode 100644 index 00000000..5b2f5bcd --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-8.c @@ -0,0 +1,17 @@ +#include "HardwareSerial.c.h" +/** + */ +int HardwareSerial_read(void) +{ + // if the head isn't ahead of the tail, we don't have any characters + if (rx_buffer.head == rx_buffer.tail) { +// if (!runSerialEvent) { + return -1; + } else { + unsigned char c = rx_buffer.buffer[rx_buffer.tail]; + rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % SERIAL_BUFFER_SIZE; + runSerialEvent = (rx_buffer.head != rx_buffer.tail); + return c; + } +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-9.c b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-9.c new file mode 100644 index 00000000..1e5975d2 --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c-9.c @@ -0,0 +1,18 @@ +#include "HardwareSerial.c.h" +/** + */ +void HardwareSerial_flush(void) +{ + // UDR is kept full while the buffer is not empty, so TXC triggers when + // EMPTY && SENT + +// while (transmitting && ! (*_ucsra & _BV(TXC0))); +// while (transmitting && ! (UARTx_SR & UARTx_SR_TC)); +#ifdef USE_SPL + while (transmitting && ! UARTx_GetFlagStatus(UARTx_FLAG_TC)); +#else + while (transmitting && !(UARTx->SR & UARTx_FLAG_TC)); +#endif + transmitting = 0; +} + diff --git a/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c.h b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c.h new file mode 100644 index 00000000..9a61558e --- /dev/null +++ b/sduino/hardware/sduino/stm8/cores/sduino/HardwareSerial.c.h @@ -0,0 +1,128 @@ +/* + HardwareSerial.c - Hardware serial library for sduino + Copyright (c) 2016 Michael Mayer + + Plain C version of HardwareSerial.cpp of the Arduino project. + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + 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 + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + 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 + + Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus + Modified 15 December 2016 by Michael Mayer +*/ + + +#include"stm8s.h" + +#include "Arduino.h" +#include "HardwareSerial.h" + + +// device dependent definitions //////////////////////////////////////////// + +#if defined(UART1) +#warning "using uart1 for HardwareSerial" +# define UARTx UART1 +# define UARTx_RX_IRQHandler UART1_RX_IRQHandler +# define ITC_IRQ_UARTx_RX ITC_IRQ_UART1_RX +# define UARTx_TX_IRQHandler UART1_TX_IRQHandler +# define ITC_IRQ_UARTx_TX ITC_IRQ_UART1_TX +# define UARTx_CR2_TIEN UART1_CR2_TIEN +# define UARTx_CR2_RIEN UART1_CR2_RIEN +# define UARTx_CR2_TEN UART1_CR2_TEN +# define UARTx_CR2_REN UART1_CR2_REN +# define UARTx_FLAG_PE UART1_FLAG_PE +# define UARTx_FLAG_TC UART1_FLAG_TC +# define UARTx_DeInit UART1_DeInit +# ifdef USE_SPL +# define UARTx_ReceiveData8 UART1_ReceiveData8 +# define UARTx_GetFlagStatus UART1_GetFlagStatus +# define UARTx_ITConfig UART1_ITConfig +# define UARTx_Init UART1_Init +# define UARTx_IT_TXE UART1_IT_TXE +# define UARTx_IT_RXNE UART1_IT_RXNE +# define UARTx_WORDLENGTH_8D UART1_WORDLENGTH_8D +# define UARTx_WORDLENGTH_9D UART1_WORDLENGTH_9D +# define UARTx_STOPBITS_1 UART1_STOPBITS_1 +# define UARTx_STOPBITS_2 UART1_STOPBITS_2 +# define UARTx_SYNCMODE_CLOCK_DISABLE UART1_SYNCMODE_CLOCK_DISABLE +# define UARTx_MODE_TXRX_ENABLE UART1_MODE_TXRX_ENABLE +# define UARTx_PARITY_NO UART1_PARITY_NO +# define UARTx_PARITY_EVEN UART1_PARITY_EVEN +# define UARTx_PARITY_ODD UART1_PARITY_ODD +# define UARTx_StopBits_TypeDef UART1_StopBits_TypeDef +# define UARTx_Parity_TypeDef UART1_Parity_TypeDef +# define UARTx_WordLength_TypeDef UART1_WordLength_TypeDef +# endif +#elif defined(UART2) +#warning "using uart2 for HardwareSerial" +# define UARTx UART2 +# define UARTx_RX_IRQHandler UART2_RX_IRQHandler +# define ITC_IRQ_UARTx_RX ITC_IRQ_UART2_RX +# define UARTx_TX_IRQHandler UART2_TX_IRQHandler +# define ITC_IRQ_UARTx_TX ITC_IRQ_UART2_TX +# define UARTx_CR2_TIEN UART2_CR2_TIEN +# define UARTx_CR2_RIEN UART2_CR2_RIEN +# define UARTx_CR2_TEN UART2_CR2_TEN +# define UARTx_CR2_REN UART2_CR2_REN +# define UARTx_FLAG_PE UART2_FLAG_PE +# define UARTx_FLAG_TC UART2_FLAG_TC +# define UARTx_DeInit UART2_DeInit +# ifdef USE_SPL +# define UARTx_ReceiveData8 UART2_ReceiveData8 +# define UARTx_GetFlagStatus UART2_GetFlagStatus +# define UARTx_ITConfig UART2_ITConfig +# define UARTx_Init UART2_Init +# define UARTx_IT_TXE UART2_IT_TXE +# define UARTx_IT_RXNE UART2_IT_RXNE +# define UARTx_WORDLENGTH_8D UART2_WORDLENGTH_8D +# define UARTx_WORDLENGTH_9D UART2_WORDLENGTH_9D +# define UARTx_STOPBITS_1 UART2_STOPBITS_1 +# define UARTx_STOPBITS_2 UART2_STOPBITS_2 +# define UARTx_SYNCMODE_CLOCK_DISABLE UART2_SYNCMODE_CLOCK_DISABLE +# define UARTx_MODE_TXRX_ENABLE UART2_MODE_TXRX_ENABLE +# define UARTx_PARITY_NO UART2_PARITY_NO +# define UARTx_PARITY_EVEN UART2_PARITY_EVEN +# define UARTx_PARITY_ODD UART2_PARITY_ODD +# define UARTx_StopBits_TypeDef UART2_StopBits_TypeDef +# define UARTx_Parity_TypeDef UART2_Parity_TypeDef +# define UARTx_WordLength_TypeDef UART2_WordLength_TypeDef +# endif +#else +# error "no UART definition found." +#endif + + +// private data ////////////////////////////////////////////////////////////// + +#define SERIAL_BUFFER_SIZE 16 +typedef struct ring_buffer +{ + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile unsigned int head; + volatile unsigned int tail; +} ring_buffer; + + +extern ring_buffer rx_buffer;// = { { 0 }, 0, 0}; +extern ring_buffer tx_buffer;// = { { 0 }, 0, 0}; + +extern volatile char transmitting;//=0; +extern unsigned char initialized;//=0 internal status. Returned on HardwareSerial() + + + From 85e9b6081dcc37c6ee7133660afaf837522afdc1 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Wed, 9 Jan 2019 13:42:22 +0100 Subject: [PATCH 27/59] don't compile all the SDuino files --- test/pinmode/Makefile | 14 ++++++++------ test/pinmode/pinmode.c | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile index d5603153..c6a5d92e 100644 --- a/test/pinmode/Makefile +++ b/test/pinmode/Makefile @@ -7,14 +7,17 @@ BINDIR=$(SDCCBASE)/bin CC=$(BINDIR)/sdcc LD=$(BINDIR)/sdld -LIBBASE=../../STM8S_StdPeriph_Driver -SDUINO=../../sduino +SDBASE=../../sduino/hardware/sduino/stm8 +LIBBASE=$(SDBASE)/STM8S_StdPeriph_Driver +SDUINO=$(SDBASE)/cores/sduino CFLAGS= --debug -mstm8 -DF_CPU=16000000L -DSTM8S103 \ - -I. -I$(SDUINO) -I$(LIBBASE)/inc -I/usr/share/sdcc/include/ + -I. -I$(SDUINO) -I$(SDBASE)/variants/standard \ + -I$(LIBBASE)/inc -I$(LIBBASE)/src \ + -I$(SDCCBASE)/share/sdcc/include/ # -DSUPPORT_ALTERNATE_MAPPINGS -LDFLAGS=-L$(LIBBASE)/src -L/opt/sdcc/share/sdcc/lib/stm8 -lstm8s103 +LDFLAGS=-L$(LIBBASE)/lib -L$(SDCCBASE)/share/sdcc/lib/stm8 -lSTM8S103 OBJECTS=$(BASENAME).rel SDOBJECTS=main.rel wiring.rel wiring_digital.rel SPI.rel \ @@ -24,8 +27,7 @@ SDOBJECTS=main.rel wiring.rel wiring_digital.rel SPI.rel \ #all: $(OBJECTS) -$(EXECUTABLE): $(OBJECTS) $(SDOBJECTS) -#test.rel wiring_digital.rel +$(EXECUTABLE): $(OBJECTS) #$(SDOBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(OBJECTS) : %.rel : %.c diff --git a/test/pinmode/pinmode.c b/test/pinmode/pinmode.c index 49b59739..9bd5a221 100644 --- a/test/pinmode/pinmode.c +++ b/test/pinmode/pinmode.c @@ -2,10 +2,12 @@ * test spi functions */ +#define ARDUINO_MAIN #include "Arduino.h" #include "wiring_private.h" +#include "stm8s_it.h" -void pinMode1(uint8_t pin, uint8_t mode) +void pinMode_c(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); @@ -266,7 +268,7 @@ uint8_t checkresult(uint8_t *adr, uint8_t *data) } -void setup(void) +void main(void) { // expected result: xx xx 00 00 00 pinMode_asm(PA1,INPUT); @@ -293,7 +295,30 @@ void setup(void) checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); } +#include "stm8s_it.h" -void loop (void) -{ -} +/* + * empty default IRQ functions to make the linker happy if the + * respective module is not to linked. + */ + +void UART1_TX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_TX){} +void UART1_RX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_RX){} + +// define as __naked to avoid the "clr a/dix x,a" prolog +#define IMPLEMENT_ISR(vect, interrupt) \ + void vect(void) __interrupt((interrupt)>>8) __naked { \ + __asm__("iret"); \ + } + +IMPLEMENT_ISR(EXTI_PORTA_IRQHandler, INT_PORTA) /* EXTI PORTA */ +IMPLEMENT_ISR(EXTI_PORTB_IRQHandler, INT_PORTB) /* EXTI PORTB */ +IMPLEMENT_ISR(EXTI_PORTC_IRQHandler, INT_PORTC) /* EXTI PORTC */ +IMPLEMENT_ISR(EXTI_PORTD_IRQHandler, INT_PORTD) /* EXTI PORTD */ +IMPLEMENT_ISR(EXTI_PORTE_IRQHandler, INT_PORTE) /* EXTI PORTE */ +IMPLEMENT_ISR(TIM1_CAP_COM_IRQHandler, INT_TIM1_CAPCOM) +//IMPLEMENT_ISR(TIM1_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM1_OVF) +//IMPLEMENT_ISR(TIM2_CAP_COM_IRQHandler, INT_TIM2_CAPCOM) +//IMPLEMENT_ISR(TIM2_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM2_OVF) + +void TIM4_UPD_OVF_IRQHandler(void) __interrupt(ITC_IRQ_TIM4_OVF){} From 3d13d610607b02a3d4d9a8f219249de51eff13a7 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Wed, 9 Jan 2019 14:01:53 +0100 Subject: [PATCH 28/59] split into separate source files --- test/pinmode/Makefile | 27 ++-- test/pinmode/main.c | 77 +++++++++ test/pinmode/pinmode-asm.c | 176 ++++++++++++++++++++ test/pinmode/pinmode-c.c | 55 +++++++ test/pinmode/pinmode.c | 324 ------------------------------------- 5 files changed, 320 insertions(+), 339 deletions(-) create mode 100644 test/pinmode/main.c create mode 100644 test/pinmode/pinmode-asm.c create mode 100644 test/pinmode/pinmode-c.c delete mode 100644 test/pinmode/pinmode.c diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile index c6a5d92e..30592c3b 100644 --- a/test/pinmode/Makefile +++ b/test/pinmode/Makefile @@ -11,30 +11,24 @@ SDBASE=../../sduino/hardware/sduino/stm8 LIBBASE=$(SDBASE)/STM8S_StdPeriph_Driver SDUINO=$(SDBASE)/cores/sduino -CFLAGS= --debug -mstm8 -DF_CPU=16000000L -DSTM8S103 \ +CPPFLAGS=-DF_CPU=16000000L -DSTM8S103 -Ddouble=float \ -I. -I$(SDUINO) -I$(SDBASE)/variants/standard \ -I$(LIBBASE)/inc -I$(LIBBASE)/src \ -I$(SDCCBASE)/share/sdcc/include/ -# -DSUPPORT_ALTERNATE_MAPPINGS +CFLAGS= -mstm8 --debug +LDFLAGS=-L$(LIBBASE)/lib -L$(SDCCBASE)/share/sdcc/lib/stm8 -lSTM8S103 -LDFLAGS=-L$(LIBBASE)/lib -L$(SDCCBASE)/share/sdcc/lib/stm8 -lSTM8S103 - -OBJECTS=$(BASENAME).rel -SDOBJECTS=main.rel wiring.rel wiring_digital.rel SPI.rel \ - HardwareSerial.rel Print.rel +OBJECTS=pinmode-c.rel pinmode-asm.rel main.rel .PHONY: all clean flash statistics #all: $(OBJECTS) -$(EXECUTABLE): $(OBJECTS) #$(SDOBJECTS) +$(EXECUTABLE): $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(OBJECTS) : %.rel : %.c - $(CC) -c $(CFLAGS) $^ -o $@ - -$(SDOBJECTS) : %.rel : $(SDUINO)/%.c - $(CC) -c $(CFLAGS) $^ -o $@ + $(CC) -c $(CPPFLAGS) $(CFLAGS) $^ -o $@ flash: $(EXECUTABLE) stm8flash -cstlinkv2 -pstm8s103?3 -w $^ @@ -45,9 +39,12 @@ readopt: # lists the length of functions and constants defined in the primary source # file -statistics: $(EXECUTABLE) - grep "[0-9] _" $(BASENAME).rst |\ - awk 'BEGIN {print "length\tfunction\n------\t----------";}{ a=strtonum("0x"$$1);if (name) print a-s "\t" name; s=a; name=$$3}' +statistics: + awk '/ CODE/ {print FILENAME "\t" strtonum("0x"$$4)}' *.sym + + +# grep "[0-9] _" $(BASENAME).rst |\ +# awk 'BEGIN {print "length\tfunction\n------\t----------";}{ a=strtonum("0x"$$1);if (name) print a-s "\t" name; s=a; name=$$3}' clean: diff --git a/test/pinmode/main.c b/test/pinmode/main.c new file mode 100644 index 00000000..42f0076b --- /dev/null +++ b/test/pinmode/main.c @@ -0,0 +1,77 @@ +/* + * test spi functions + */ + +#define ARDUINO_MAIN +#include "Arduino.h" +#include "wiring_private.h" +#include "stm8s_it.h" + +void pinMode_c(uint8_t pin, uint8_t mode); +void pinMode_asm(uint8_t pin, uint8_t mode); + + +uint8_t checkresult(uint8_t *adr, uint8_t *data) +{ + uint8_t i,ok; + + ok = 1; + for (i=0; i<3; ++i) { + if (adr[2+i] != data[i]) ok=0; + } + return ok; +} + + +void main(void) +{ + // expected result: xx xx 00 00 00 + pinMode_asm(PA1,INPUT); + checkresult(GPIOA_BaseAddress, "\x00\x00\x00"); + + // expected result: xx xx 20 20 00 + pinMode_asm(PB5,OUTPUT); + checkresult(GPIOB_BaseAddress, "\x20\x20\x00"); + + // expected result: xx xx 00 10 00 + pinMode_asm(PC4,INPUT_PULLUP); + checkresult(GPIOC_BaseAddress, "\x00\x10\x00"); + + // expected result: xx xx 20 10 00 + pinMode_asm(PC5,OUTPUT_OD); + checkresult(GPIOC_BaseAddress, "\x20\x10\x00"); + + // expected result: xx xx 02 02 02 + pinMode_asm(PD1,OUTPUT_FAST); + checkresult(GPIOD_BaseAddress, "\x02\x02\x02"); + + // expected result: xx xx 42 02 42 + pinMode_asm(PD6,OUTPUT_OD_FAST); + checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); +} + +/* + * empty default IRQ functions to make the linker happy if the + * respective module is not to linked. + */ + +void UART1_TX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_TX){} +void UART1_RX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_RX){} + +// define as __naked to avoid the "clr a/dix x,a" prolog +#define IMPLEMENT_ISR(vect, interrupt) \ + void vect(void) __interrupt((interrupt)>>8) __naked { \ + __asm__("iret"); \ + } + +IMPLEMENT_ISR(EXTI_PORTA_IRQHandler, INT_PORTA) /* EXTI PORTA */ +IMPLEMENT_ISR(EXTI_PORTB_IRQHandler, INT_PORTB) /* EXTI PORTB */ +IMPLEMENT_ISR(EXTI_PORTC_IRQHandler, INT_PORTC) /* EXTI PORTC */ +IMPLEMENT_ISR(EXTI_PORTD_IRQHandler, INT_PORTD) /* EXTI PORTD */ +IMPLEMENT_ISR(EXTI_PORTE_IRQHandler, INT_PORTE) /* EXTI PORTE */ +IMPLEMENT_ISR(TIM1_CAP_COM_IRQHandler, INT_TIM1_CAPCOM) +//IMPLEMENT_ISR(TIM1_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM1_OVF) +//IMPLEMENT_ISR(TIM2_CAP_COM_IRQHandler, INT_TIM2_CAPCOM) +//IMPLEMENT_ISR(TIM2_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM2_OVF) + +void TIM4_UPD_OVF_IRQHandler(void) __interrupt(ITC_IRQ_TIM4_OVF){} diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c new file mode 100644 index 00000000..a8f073ca --- /dev/null +++ b/test/pinmode/pinmode-asm.c @@ -0,0 +1,176 @@ +/* + * test spi functions + */ + +#include "Arduino.h" +#include "wiring_private.h" + + +void pinMode_asm(uint8_t pin, uint8_t mode) +{ + (void) pin; // empty code to avoid warning + (void) mode; +__asm + sub sp, #16 +#if 1 +; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); + clrw x + + ld a,(0x03, sp) + ld xl,a + addw x, #_digital_pin_to_bit_mask_PGM+0 + ld a, (x) ; bit + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit + +; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); +;;hier addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM + ld a, (x) ; port + jreq 00018$ + + sll a + clrw x + ld xl,a + addw x, #_port_to_output_PGM+0 ; x = gpio + + ld a,(0x04,sp) ; a = mode, flags are set +#else +; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); + ldw x, #_digital_pin_to_bit_mask_PGM+0 + ld a, xl + add a, (0x13, sp) + rlwa x + adc a, #0x00 + ld xh, a + ld a, (x) + ld (0x04, sp), a ; bit := 4 +; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); + ldw x, #_digital_pin_to_port_PGM+0 + ld a, xl + add a, (0x13, sp) + rlwa x + adc a, #0x00 + ld xh, a + ld a, (x) + ld (0x03, sp), a + ld a, (0x03, sp) + ld (0x07, sp), a ; port := 7 +; pinmode.c: 14: if (port == NOT_A_PIN) return; + tnz (0x03, sp) + jrne 00002$ + jp 00018$ +00002$: +; pinmode.c: 16: gpio = (GPIO_TypeDef *) portOutputRegister(port); + ldw x, #_port_to_output_PGM+0 + ldw (0x0e, sp), x + ld a, (0x07, sp) + ld xl, a + ld a, #0x02 + mul x, a + addw x, (0x0e, sp) + ldw x, (x) ; jetzt ist gpio in x + + ld a, (0x04, sp) ; bit + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit + ld a, (0x14, sp) ; a=mode, flags are set +#endif + +; gpio->DDR: (2,x) (war an c,SP) +; gpio->CR1: (3,x) (war an 8,SP) +; gpio->CR2: (4,x) (war an 5,SP) + + sim +; pinmode.c: 18: if (mode == INPUT) { + jrne 00016$ +; pinmode.c: 20: gpio->CR2 &= ~bit; // first: deactivate interrupt + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 21: gpio->CR1 &= ~bit; // release top side + ld a,yh + and a,(3,x) + ld (3,x),a +; pinmode.c: 22: gpio->DDR &= ~bit; // now set direction + ld a,yh + and a,(2,x) + jp 00022$ + +00016$: +; pinmode.c: 24: } else if (mode == INPUT_PULLUP) { + cp a, #0x02 + jrne 00013$ +; pinmode.c: 26: gpio->CR2 &= ~bit; // first: deactivate interrupt + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 27: gpio->DDR &= ~bit; // set direction before + ld a,yh +and a,(2,x) + ld (2,x),a +; pinmode.c: 28: gpio->CR1 |= bit; // activating the pull up + ld a,yl + or a,(3,x) + ld (3,x),a + jp 00018$ + +00013$: +; pinmode.c: 30: } else if (mode == OUTPUT_FAST) {// output push-pull, fast + cp a, #0x05 + jrne 00010$ +; pinmode.c: 32: gpio->CR1 |= bit; + ld a,yl + or a,(3,x) + jra 00020$ +; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to +; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt +00010$: +; pinmode.c: 36: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + cp a, #0x07 + jrne 00007$ +; pinmode.c: 38: gpio->CR1 &= ~bit; + ld a,yh + and a,(3,x) +00020$: ld (3,x),a +; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to + ld a,yl + or a,(2,x) + ld (2,x),a +; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt + ld a,yl + or a,(4,x) + ld (4,x),a + jra 00018$ + +00007$: +; pinmode.c: 42: } else if (mode == OUTPUT_OD) { // output open drain, slow + cp a, #0x03 + jrne 00004$ +; pinmode.c: 44: gpio->CR1 &= ~bit; + ld a,yh + and a,(3,x) + jra 00021$ +; pinmode.c: 45: gpio->CR2 &= ~bit; +; pinmode.c: 46: gpio->DDR |= bit; +00004$: +; pinmode.c: 50: gpio->CR1 |= bit; + ld a,yl + or a,(3,x) +00021$: ld (3,x),a +; pinmode.c: 51: gpio->CR2 &= ~bit; + ld a,yh + and a,(4,x) + ld (4,x),a +; pinmode.c: 52: gpio->DDR |= bit; + ld a,yl + or a,(2,x) +00022$: ld (2,x),a +00018$: + rim + addw sp, #16 +__endasm; +} + + diff --git a/test/pinmode/pinmode-c.c b/test/pinmode/pinmode-c.c new file mode 100644 index 00000000..f59bbed5 --- /dev/null +++ b/test/pinmode/pinmode-c.c @@ -0,0 +1,55 @@ +/* + * test spi functions + */ + +#include "Arduino.h" +#include "wiring_private.h" + +void pinMode_c(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile GPIO_TypeDef *gpio; + + if (port == NOT_A_PIN) return; + + gpio = (GPIO_TypeDef *) portOutputRegister(port); + + if (mode == INPUT) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->CR1 &= ~bit; // release top side + gpio->DDR &= ~bit; // now set direction + END_CRITICAL + } else if (mode == INPUT_PULLUP) { + BEGIN_CRITICAL + gpio->CR2 &= ~bit; // first: deactivate interrupt + gpio->DDR &= ~bit; // set direction before + gpio->CR1 |= bit; // activating the pull up + END_CRITICAL + } else if (mode == OUTPUT_FAST) {// output push-pull, fast + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->DDR |= bit; // direction before setting CR2 to + gpio->CR2 |= bit; // avoid accidental interrupt + END_CRITICAL + } else if (mode == OUTPUT_OD) { // output open drain, slow + BEGIN_CRITICAL + gpio->CR1 &= ~bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } else { // output push-pull, slow + BEGIN_CRITICAL + gpio->CR1 |= bit; + gpio->CR2 &= ~bit; + gpio->DDR |= bit; + END_CRITICAL + } +} diff --git a/test/pinmode/pinmode.c b/test/pinmode/pinmode.c deleted file mode 100644 index 9bd5a221..00000000 --- a/test/pinmode/pinmode.c +++ /dev/null @@ -1,324 +0,0 @@ -/* - * test spi functions - */ - -#define ARDUINO_MAIN -#include "Arduino.h" -#include "wiring_private.h" -#include "stm8s_it.h" - -void pinMode_c(uint8_t pin, uint8_t mode) -{ - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - volatile GPIO_TypeDef *gpio; - - if (port == NOT_A_PIN) return; - - gpio = (GPIO_TypeDef *) portOutputRegister(port); - - if (mode == INPUT) { - BEGIN_CRITICAL - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->CR1 &= ~bit; // release top side - gpio->DDR &= ~bit; // now set direction - END_CRITICAL - } else if (mode == INPUT_PULLUP) { - BEGIN_CRITICAL - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->DDR &= ~bit; // set direction before - gpio->CR1 |= bit; // activating the pull up - END_CRITICAL - } else if (mode == OUTPUT_FAST) {// output push-pull, fast - BEGIN_CRITICAL - gpio->CR1 |= bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - END_CRITICAL - } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast - BEGIN_CRITICAL - gpio->CR1 &= ~bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - END_CRITICAL - } else if (mode == OUTPUT_OD) { // output open drain, slow - BEGIN_CRITICAL - gpio->CR1 &= ~bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - END_CRITICAL - } else { // output push-pull, slow - BEGIN_CRITICAL - gpio->CR1 |= bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - END_CRITICAL - } -} - -#if 0 - if (mode == INPUT) { - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->CR1 &= ~bit; // release top side - gpio->DDR &= ~bit; // now set direction - } else if (mode == INPUT_PULLUP) { - gpio->CR2 &= ~bit; // first: deactivate interrupt - gpio->DDR &= ~bit; // set direction before - gpio->CR1 |= bit; // activating the pull up - - } else if (mode == OUTPUT_FAST) {// output push-pull, fast - gpio->CR1 |= bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast - gpio->CR1 &= ~bit; - gpio->DDR |= bit; // direction before setting CR2 to - gpio->CR2 |= bit; // avoid accidental interrupt - - } else if (mode == OUTPUT_OD) { // output open drain, slow - gpio->CR1 &= ~bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - } else { // output push-pull, slow - gpio->CR1 |= bit; - gpio->CR2 &= ~bit; - gpio->DDR |= bit; - } -#endif - -// -void pinMode_asm(uint8_t pin, uint8_t mode) -{ - (void) pin; // empty code to avoid warning - (void) mode; -__asm - sub sp, #16 -#if 1 -; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); - clrw x - - ld a,(0x03, sp) - ld xl,a - addw x, #_digital_pin_to_bit_mask_PGM+0 - ld a, (x) ; bit - ld yl,a ; yl = bit - cpl a - ld yh,a ; yh = ~bit - -; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); -;;hier addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM - ld a, (x) ; port - jreq 00018$ - - sll a - clrw x - ld xl,a - addw x, #_port_to_output_PGM+0 ; x = gpio - - ld a,(0x04,sp) ; a = mode, flags are set -#else -; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); - ldw x, #_digital_pin_to_bit_mask_PGM+0 - ld a, xl - add a, (0x13, sp) - rlwa x - adc a, #0x00 - ld xh, a - ld a, (x) - ld (0x04, sp), a ; bit := 4 -; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); - ldw x, #_digital_pin_to_port_PGM+0 - ld a, xl - add a, (0x13, sp) - rlwa x - adc a, #0x00 - ld xh, a - ld a, (x) - ld (0x03, sp), a - ld a, (0x03, sp) - ld (0x07, sp), a ; port := 7 -; pinmode.c: 14: if (port == NOT_A_PIN) return; - tnz (0x03, sp) - jrne 00002$ - jp 00018$ -00002$: -; pinmode.c: 16: gpio = (GPIO_TypeDef *) portOutputRegister(port); - ldw x, #_port_to_output_PGM+0 - ldw (0x0e, sp), x - ld a, (0x07, sp) - ld xl, a - ld a, #0x02 - mul x, a - addw x, (0x0e, sp) - ldw x, (x) ; jetzt ist gpio in x - - ld a, (0x04, sp) ; bit - ld yl,a ; yl = bit - cpl a - ld yh,a ; yh = ~bit - ld a, (0x14, sp) ; a=mode, flags are set -#endif - -; gpio->DDR: (2,x) (war an c,SP) -; gpio->CR1: (3,x) (war an 8,SP) -; gpio->CR2: (4,x) (war an 5,SP) - - sim -; pinmode.c: 18: if (mode == INPUT) { - jrne 00016$ -; pinmode.c: 20: gpio->CR2 &= ~bit; // first: deactivate interrupt - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 21: gpio->CR1 &= ~bit; // release top side - ld a,yh - and a,(3,x) - ld (3,x),a -; pinmode.c: 22: gpio->DDR &= ~bit; // now set direction - ld a,yh - and a,(2,x) - jp 00022$ - -00016$: -; pinmode.c: 24: } else if (mode == INPUT_PULLUP) { - cp a, #0x02 - jrne 00013$ -; pinmode.c: 26: gpio->CR2 &= ~bit; // first: deactivate interrupt - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 27: gpio->DDR &= ~bit; // set direction before - ld a,yh -and a,(2,x) - ld (2,x),a -; pinmode.c: 28: gpio->CR1 |= bit; // activating the pull up - ld a,yl - or a,(3,x) - ld (3,x),a - jp 00018$ - -00013$: -; pinmode.c: 30: } else if (mode == OUTPUT_FAST) {// output push-pull, fast - cp a, #0x05 - jrne 00010$ -; pinmode.c: 32: gpio->CR1 |= bit; - ld a,yl - or a,(3,x) - jra 00020$ -; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to -; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt -00010$: -; pinmode.c: 36: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast - cp a, #0x07 - jrne 00007$ -; pinmode.c: 38: gpio->CR1 &= ~bit; - ld a,yh - and a,(3,x) -00020$: ld (3,x),a -; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to - ld a,yl - or a,(2,x) - ld (2,x),a -; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt - ld a,yl - or a,(4,x) - ld (4,x),a - jra 00018$ - -00007$: -; pinmode.c: 42: } else if (mode == OUTPUT_OD) { // output open drain, slow - cp a, #0x03 - jrne 00004$ -; pinmode.c: 44: gpio->CR1 &= ~bit; - ld a,yh - and a,(3,x) - jra 00021$ -; pinmode.c: 45: gpio->CR2 &= ~bit; -; pinmode.c: 46: gpio->DDR |= bit; -00004$: -; pinmode.c: 50: gpio->CR1 |= bit; - ld a,yl - or a,(3,x) -00021$: ld (3,x),a -; pinmode.c: 51: gpio->CR2 &= ~bit; - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 52: gpio->DDR |= bit; - ld a,yl - or a,(2,x) -00022$: ld (2,x),a -00018$: - rim - addw sp, #16 -__endasm; -} -// - - -uint8_t checkresult(uint8_t *adr, uint8_t *data) -{ - uint8_t i,ok; - - ok = 1; - for (i=0; i<3; ++i) { - if (adr[2+i] != data[i]) ok=0; - } - return ok; -} - - -void main(void) -{ - // expected result: xx xx 00 00 00 - pinMode_asm(PA1,INPUT); - checkresult(GPIOA_BaseAddress, "\x00\x00\x00"); - - // expected result: xx xx 20 20 00 - pinMode_asm(PB5,OUTPUT); - checkresult(GPIOB_BaseAddress, "\x20\x20\x00"); - - // expected result: xx xx 00 10 00 - pinMode_asm(PC4,INPUT_PULLUP); - checkresult(GPIOC_BaseAddress, "\x00\x10\x00"); - - // expected result: xx xx 20 10 00 - pinMode_asm(PC5,OUTPUT_OD); - checkresult(GPIOC_BaseAddress, "\x20\x10\x00"); - - // expected result: xx xx 02 02 02 - pinMode_asm(PD1,OUTPUT_FAST); - checkresult(GPIOD_BaseAddress, "\x02\x02\x02"); - - // expected result: xx xx 42 02 42 - pinMode_asm(PD6,OUTPUT_OD_FAST); - checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); -} - -#include "stm8s_it.h" - -/* - * empty default IRQ functions to make the linker happy if the - * respective module is not to linked. - */ - -void UART1_TX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_TX){} -void UART1_RX_IRQHandler(void) __interrupt(ITC_IRQ_UART1_RX){} - -// define as __naked to avoid the "clr a/dix x,a" prolog -#define IMPLEMENT_ISR(vect, interrupt) \ - void vect(void) __interrupt((interrupt)>>8) __naked { \ - __asm__("iret"); \ - } - -IMPLEMENT_ISR(EXTI_PORTA_IRQHandler, INT_PORTA) /* EXTI PORTA */ -IMPLEMENT_ISR(EXTI_PORTB_IRQHandler, INT_PORTB) /* EXTI PORTB */ -IMPLEMENT_ISR(EXTI_PORTC_IRQHandler, INT_PORTC) /* EXTI PORTC */ -IMPLEMENT_ISR(EXTI_PORTD_IRQHandler, INT_PORTD) /* EXTI PORTD */ -IMPLEMENT_ISR(EXTI_PORTE_IRQHandler, INT_PORTE) /* EXTI PORTE */ -IMPLEMENT_ISR(TIM1_CAP_COM_IRQHandler, INT_TIM1_CAPCOM) -//IMPLEMENT_ISR(TIM1_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM1_OVF) -//IMPLEMENT_ISR(TIM2_CAP_COM_IRQHandler, INT_TIM2_CAPCOM) -//IMPLEMENT_ISR(TIM2_UPD_OVF_TRG_BRK_IRQHandler, INT_TIM2_OVF) - -void TIM4_UPD_OVF_IRQHandler(void) __interrupt(ITC_IRQ_TIM4_OVF){} From b75a79a33a7664914c056dd5d3618818cb28f323 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Wed, 9 Jan 2019 14:28:21 +0100 Subject: [PATCH 29/59] use a separate build directory, better statistics --- test/pinmode/Makefile | 20 ++++++++++++-------- test/pinmode/main.c | 5 ++--- test/pinmode/pinmode-asm.c | 4 +--- test/pinmode/pinmode-c.c | 1 - 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile index 30592c3b..f4106d1d 100644 --- a/test/pinmode/Makefile +++ b/test/pinmode/Makefile @@ -15,19 +15,23 @@ CPPFLAGS=-DF_CPU=16000000L -DSTM8S103 -Ddouble=float \ -I. -I$(SDUINO) -I$(SDBASE)/variants/standard \ -I$(LIBBASE)/inc -I$(LIBBASE)/src \ -I$(SDCCBASE)/share/sdcc/include/ -CFLAGS= -mstm8 --debug +CFLAGS= -mstm8 #--debug LDFLAGS=-L$(LIBBASE)/lib -L$(SDCCBASE)/share/sdcc/lib/stm8 -lSTM8S103 -OBJECTS=pinmode-c.rel pinmode-asm.rel main.rel +SRCS=pinmode-c.c pinmode-asm.c main.c + +BUILDDIR=build +OBJECTS=$(SRCS:%.c=$(BUILDDIR)/%.rel) .PHONY: all clean flash statistics -#all: $(OBJECTS) +all: $(EXECUTEABLE) statistics $(EXECUTABLE): $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ -$(OBJECTS) : %.rel : %.c +$(OBJECTS) : $(BUILDDIR)/%.rel : %.c + mkdir -p $(BUILDDIR) $(CC) -c $(CPPFLAGS) $(CFLAGS) $^ -o $@ flash: $(EXECUTABLE) @@ -39,8 +43,8 @@ readopt: # lists the length of functions and constants defined in the primary source # file -statistics: - awk '/ CODE/ {print FILENAME "\t" strtonum("0x"$$4)}' *.sym +statistics: $(OBJECTS) + cd $(BUILDDIR); awk '/ CODE/ {print FILENAME "\t" strtonum("0x"$$4)}' *.sym # grep "[0-9] _" $(BASENAME).rst |\ @@ -48,6 +52,6 @@ statistics: clean: - rm -f *.lib *.rst *.rel *.lst *.ihx *.sym *.asm *.lk *.map \ - *.cdb *.adb *~ *.bak + rm -rf *.lib *.rst *.rel *.lst *.ihx *.sym *.asm *.lk *.map \ + *.cdb *.adb *~ *.bak build rm -f $(EXECUTABLE) diff --git a/test/pinmode/main.c b/test/pinmode/main.c index 42f0076b..df86f940 100644 --- a/test/pinmode/main.c +++ b/test/pinmode/main.c @@ -4,20 +4,19 @@ #define ARDUINO_MAIN #include "Arduino.h" -#include "wiring_private.h" #include "stm8s_it.h" void pinMode_c(uint8_t pin, uint8_t mode); void pinMode_asm(uint8_t pin, uint8_t mode); -uint8_t checkresult(uint8_t *adr, uint8_t *data) +uint8_t checkresult(uint16_t adr, uint8_t *data) { uint8_t i,ok; ok = 1; for (i=0; i<3; ++i) { - if (adr[2+i] != data[i]) ok=0; + if (((uint8_t*)adr)[2+i] != data[i]) ok=0; } return ok; } diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c index a8f073ca..56569323 100644 --- a/test/pinmode/pinmode-asm.c +++ b/test/pinmode/pinmode-asm.c @@ -2,9 +2,7 @@ * test spi functions */ -#include "Arduino.h" -#include "wiring_private.h" - +#include void pinMode_asm(uint8_t pin, uint8_t mode) { diff --git a/test/pinmode/pinmode-c.c b/test/pinmode/pinmode-c.c index f59bbed5..ab7579ee 100644 --- a/test/pinmode/pinmode-c.c +++ b/test/pinmode/pinmode-c.c @@ -3,7 +3,6 @@ */ #include "Arduino.h" -#include "wiring_private.h" void pinMode_c(uint8_t pin, uint8_t mode) { From 532191af6914d08b34cbd5c1995d8aae1c1b8208 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 10 Jan 2019 15:31:07 +0100 Subject: [PATCH 30/59] improved test function, assembler version of pinMode - Hand-optimized version of pinMode works, 168 Bytes. More potential left. - Added a simulator target in the Makefile. - the test results are shown in the simulator memory dump --- docs/api/migration.md | 2 + test/pinmode/Makefile | 14 ++- test/pinmode/README.md | 30 +++++++ test/pinmode/main.c | 67 +++++++++++---- test/pinmode/pinmode-asm.c | 170 ++++++++++++++++++++++++++++++++++++- test/pinmode/pinmode-c.c | 2 +- test/pinmode/sim | 14 +++ 7 files changed, 274 insertions(+), 25 deletions(-) create mode 100644 test/pinmode/sim diff --git a/docs/api/migration.md b/docs/api/migration.md index 034c8edf..f708cc55 100644 --- a/docs/api/migration.md +++ b/docs/api/migration.md @@ -96,6 +96,8 @@ names. The preprocessor does not allow for variable macro names. That means `_Generic` would work with fixed name like `Serial`, but it wouldn't work for `SoftwareSerial` with no standard instance name. +[This](https://mort.coffee/home/obscure-c-features/) is a good introduction +into the use of `_Generic`. diff --git a/test/pinmode/Makefile b/test/pinmode/Makefile index f4106d1d..28cc37a9 100644 --- a/test/pinmode/Makefile +++ b/test/pinmode/Makefile @@ -1,5 +1,5 @@ BASENAME=$(shell basename $$(pwd)) -EXECUTABLE=$(BASENAME).ihx +EXECUTEABLE=$(BASENAME).ihx #SDCCBASE=/usr/local SDCCBASE=/opt/sdcc @@ -23,11 +23,11 @@ SRCS=pinmode-c.c pinmode-asm.c main.c BUILDDIR=build OBJECTS=$(SRCS:%.c=$(BUILDDIR)/%.rel) -.PHONY: all clean flash statistics +.PHONY: all clean flash statistics sim -all: $(EXECUTEABLE) statistics +all: $(EXECUTEABLE) statistics sim -$(EXECUTABLE): $(OBJECTS) +$(EXECUTEABLE): $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(OBJECTS) : $(BUILDDIR)/%.rel : %.c @@ -46,6 +46,12 @@ readopt: statistics: $(OBJECTS) cd $(BUILDDIR); awk '/ CODE/ {print FILENAME "\t" strtonum("0x"$$4)}' *.sym +sim: $(EXECUTEABLE) + @. ./sim + +# @. ./sim | grep "0x0001 00 00 00 00 00 00" +# . ./sim | grep "0x0001 00 00 00 00 00 00" || echo "fail" + # grep "[0-9] _" $(BASENAME).rst |\ # awk 'BEGIN {print "length\tfunction\n------\t----------";}{ a=strtonum("0x"$$1);if (name) print a-s "\t" name; s=a; name=$$3}' diff --git a/test/pinmode/README.md b/test/pinmode/README.md index 1ef3c9a0..676546ea 100644 --- a/test/pinmode/README.md +++ b/test/pinmode/README.md @@ -7,3 +7,33 @@ after first commit (176 bytes): 0081B4 269 _pinMode_asm: 008264 410 _setup: 00826E 424 _loop: + +Reihenfolgen: +INPUT |-CR2, -CR1, -DDR +INPUT_PULLUP |-CR2, -DDR, +CR1 +OUTPUT_FAST |+CR1, +DDR, +CR2 +OUTPUT_OD_FAST |-CR1, +DDR, +CR2 +OUTPUT_OD |-CR1, -CR2, +DDR +OUTPUT |+CR1, -CR2, +DDR + +mode CR2 + + +sstm8 -tS003 -S uart=1,port=10000 mini.ihx + + +CR1: pullup bzw. open-drain + +CR2: in: INT, out: fast +- input: als erstes reset +- output: als letztes setzen (nach DDR) + + +Schritt 1: CR2 (in: INT, out: fast) +- set: OUTPUT_FAST, OUTPUT_OD_FAST +- reset: sonst + + +## Simulator + +-i m: info memory diff --git a/test/pinmode/main.c b/test/pinmode/main.c index df86f940..cb24e038 100644 --- a/test/pinmode/main.c +++ b/test/pinmode/main.c @@ -1,5 +1,11 @@ -/* - * test spi functions +/** + * Test the optimized Versions of pinMode + * + * After each test the content of the GPIO registers is checked against + * the expected values. The table results[] contains the number of mismatched + * bytes after each test. + * + * Expected result: all bytes in results[] == 0x00 */ #define ARDUINO_MAIN @@ -9,44 +15,69 @@ void pinMode_c(uint8_t pin, uint8_t mode); void pinMode_asm(uint8_t pin, uint8_t mode); +// select which function should be used for the test +#define pinMode_test pinMode_asm + +uint8_t results[6]; +/** + * checks a memory area for an expected content + * + * @returns: number of mismatched bytes (0=ok) + */ uint8_t checkresult(uint16_t adr, uint8_t *data) { - uint8_t i,ok; + uint8_t i,err; - ok = 1; + err = 0; for (i=0; i<3; ++i) { - if (((uint8_t*)adr)[2+i] != data[i]) ok=0; + if (((uint8_t*)adr)[2+i] != data[i]) err++; } - return ok; + return err; } +/** + * fills a memory area with zeros + * + * The simulator does not clear the memory and does not properly + * initialize the IO registers after reset. Use this instead. + */ +void _memset(unsigned char *adr, unsigned int cnt) +{ + while (cnt--) *adr++=0; +} void main(void) { + unsigned char *r = results; + + _memset((unsigned char *)GPIOA_BaseAddress, 20); + // expected result: xx xx 00 00 00 - pinMode_asm(PA1,INPUT); - checkresult(GPIOA_BaseAddress, "\x00\x00\x00"); + pinMode_test(PA1,INPUT); + *r++ = checkresult(GPIOA_BaseAddress, "\x00\x00\x00"); // expected result: xx xx 20 20 00 - pinMode_asm(PB5,OUTPUT); - checkresult(GPIOB_BaseAddress, "\x20\x20\x00"); + pinMode_test(PB5,OUTPUT); + *r++ = checkresult(GPIOB_BaseAddress, "\x20\x20\x00"); // expected result: xx xx 00 10 00 - pinMode_asm(PC4,INPUT_PULLUP); - checkresult(GPIOC_BaseAddress, "\x00\x10\x00"); + pinMode_test(PC4,INPUT_PULLUP); + *r++ = checkresult(GPIOC_BaseAddress, "\x00\x10\x00"); // expected result: xx xx 20 10 00 - pinMode_asm(PC5,OUTPUT_OD); - checkresult(GPIOC_BaseAddress, "\x20\x10\x00"); + pinMode_test(PC5,OUTPUT_OD); + *r++ = checkresult(GPIOC_BaseAddress, "\x20\x10\x00"); // expected result: xx xx 02 02 02 - pinMode_asm(PD1,OUTPUT_FAST); - checkresult(GPIOD_BaseAddress, "\x02\x02\x02"); + pinMode_test(PD1,OUTPUT_FAST); + *r++ = checkresult(GPIOD_BaseAddress, "\x02\x02\x02"); // expected result: xx xx 42 02 42 - pinMode_asm(PD6,OUTPUT_OD_FAST); - checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); + pinMode_test(PD6,OUTPUT_OD_FAST); + *r++ = checkresult(GPIOD_BaseAddress, "\x42\x02\x42"); + + for(;;); // endless loop } /* diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c index 56569323..96ce696d 100644 --- a/test/pinmode/pinmode-asm.c +++ b/test/pinmode/pinmode-asm.c @@ -4,6 +4,173 @@ #include +#define DDR 2 +#define CR1 3 +#define CR2 4 + +#define BIT_CLEAR(REG) \ + ld a,yh\ + and a,(REG,x)\ + ld (REG,x),a + +#define BIT_SET(REG) \ + ld a,yl\ + or a,(REG,x)\ + ld (REG,x),a + + +void pinMode_asm(uint8_t pin, uint8_t mode) +{ + (void) pin; // empty code to avoid warning + (void) mode; +__asm + +; my optimized code +; nicht mehr benötigte Stack-Variablen: +; (0x01, sp) war bit +; (0x07, sp) war port-ID +; (0x08, sp) war port-ID + + sub sp, #8 +; pinmode-c.c: 9: uint8_t bit = digitalPinToBitMask(pin); + clrw x + ld a, (0x0b, sp) +ld 0x0100,a + ld xl, a + addw x, #(_digital_pin_to_bit_mask_PGM + 0) + ld a, (x) +ld 0x0101,a + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit +; pinmode-c.c: 10: uint8_t port = digitalPinToPort(pin); +; es könnte auch subw x, #(NUM_DIGITAL_PINS) sein + clrw x + ld a, (0x0b, sp) + ld xl, a + addw x, #(_digital_pin_to_port_PGM + 0) + ld a, (x) ; port-ID. Z-Flag wird gesetzt +; pinmode-c.c: 13: if (port == NOT_A_PORT) return; +; jreq 00118$ + + +; +; Zuordung port-ID => Port-Addresse +; + +00102$: +; pinmode-c.c: 15: gpio = (GPIO_TypeDef *) portOutputRegister(port); +;****** + clrw x + sll a ; 8 bit shift is sufficient + ld xl, a + addw x, #(_port_to_output_PGM + 0) + ldw x, (x) ; jetzt ist gpio in x +ldw 0x0102,x + + +; +; case INPUT +; +; pinmode-c.c: 17: if (mode == INPUT) { + ld a, (0x0c, sp) + jrne 00116$ + +; pinmode-c.c: 19: gpio->CR2 &= ~bit; // first: deactivate interrupt +; pinmode-c.c: 20: gpio->CR1 &= ~bit; // release top side +; pinmode-c.c: 21: gpio->DDR &= ~bit; // now set direction + sim + BIT_CLEAR(CR2) + BIT_CLEAR(CR1) + BIT_CLEAR(DDR) + rim + jp 00118$ + +; +; case INPUT_PULLUP +; +00116$: +; pinmode-c.c: 23: } else if (mode == INPUT_PULLUP) { + cp a, #0x02 + jrne 00113$ +; pinmode-c.c: 25: gpio->CR2 &= ~bit; // first: deactivate interrupt +; pinmode-c.c: 26: gpio->DDR &= ~bit; // set direction before +; pinmode-c.c: 27: gpio->CR1 |= bit; // activating the pull up + sim + BIT_CLEAR(CR2) + BIT_CLEAR(DDR) + BIT_SET(CR1) + rim + jp 00118$ + +; +; case OUTPUT_FAST +; +00113$: +; pinmode-c.c: 29: } else if (mode == OUTPUT_FAST) {// output push-pull, fast + cp a, #0x05 + jrne 00110$ + +; pinmode-c.c: 31: gpio->CR1 |= bit; +; pinmode-c.c: 32: gpio->DDR |= bit; // direction before setting CR2 to +; pinmode-c.c: 33: gpio->CR2 |= bit; // avoid accidental interrupt + sim + BIT_SET(CR1) + jra 010$ + +; +; case OUTPUT_OD_FAST +; +00110$: +; pinmode-c.c: 35: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast + cp a, #0x07 + jrne 00107$ + +; pinmode-c.c: 37: gpio->CR1 &= ~bit; +; pinmode-c.c: 38: gpio->DDR |= bit; // direction before setting CR2 to +; pinmode-c.c: 39: gpio->CR2 |= bit; // avoid accidental interrupt + sim + BIT_CLEAR(CR1) +010$: BIT_SET(DDR) + BIT_SET(CR2) + rim + jra 00118$ + +; +; case OUTPUT_OD +; +00107$: +; pinmode-c.c: 41: } else if (mode == OUTPUT_OD) { // output open drain, slow + cp a, #0x03 + jrne 00104$ + +; pinmode-c.c: 43: gpio->CR1 &= ~bit; +; pinmode-c.c: 44: gpio->CR2 &= ~bit; +; pinmode-c.c: 45: gpio->DDR |= bit; + sim + BIT_CLEAR(CR1) + jra 004$ + +; +; case default +; +00104$: +; pinmode-c.c: 49: gpio->CR1 |= bit; +; pinmode-c.c: 50: gpio->CR2 &= ~bit; +; pinmode-c.c: 51: gpio->DDR |= bit; + sim + BIT_SET(CR1) +004$: BIT_CLEAR(CR2) + BIT_SET(DDR) + rim + +00118$: +; pinmode-c.c: 54: } + addw sp, #8 +__endasm; +} + +/* void pinMode_asm(uint8_t pin, uint8_t mode) { (void) pin; // empty code to avoid warning @@ -170,5 +337,4 @@ and a,(2,x) addw sp, #16 __endasm; } - - +*/ diff --git a/test/pinmode/pinmode-c.c b/test/pinmode/pinmode-c.c index ab7579ee..bcfdd4f5 100644 --- a/test/pinmode/pinmode-c.c +++ b/test/pinmode/pinmode-c.c @@ -10,7 +10,7 @@ void pinMode_c(uint8_t pin, uint8_t mode) uint8_t port = digitalPinToPort(pin); volatile GPIO_TypeDef *gpio; - if (port == NOT_A_PIN) return; + if (port == NOT_A_PORT) return; gpio = (GPIO_TypeDef *) portOutputRegister(port); diff --git a/test/pinmode/sim b/test/pinmode/sim new file mode 100644 index 00000000..d2f997c2 --- /dev/null +++ b/test/pinmode/sim @@ -0,0 +1,14 @@ +#!/bin/bash + +sstm8 -t S103 pinmode.ihx << EOF +fill ram_chip 0 1023 0 +fill io_chip 0 44 0 +s 10000 +du io_chip 0 4 +du io_chip 5 9 +du io_chip 10 14 +du io_chip 15 19 +du ram_chip 1 6 +du ram_chip 0x0100 +quit +EOF From 20cc444d8d7ff1a24e0116837ade221edaae2578 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 10 Jan 2019 15:48:05 +0100 Subject: [PATCH 31/59] clean up comments, simpler jump layout, 152 Bytes --- test/pinmode/pinmode-asm.c | 95 ++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 49 deletions(-) diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c index 96ce696d..a7f8a24b 100644 --- a/test/pinmode/pinmode-asm.c +++ b/test/pinmode/pinmode-asm.c @@ -25,148 +25,145 @@ void pinMode_asm(uint8_t pin, uint8_t mode) (void) mode; __asm -; my optimized code -; nicht mehr benötigte Stack-Variablen: -; (0x01, sp) war bit -; (0x07, sp) war port-ID -; (0x08, sp) war port-ID +; +; position of the parameters on the stack: +; (3,sp) pin +; (4,sp) mode +; + +; +; Zuordnung pin => bit mask +; - sub sp, #8 ; pinmode-c.c: 9: uint8_t bit = digitalPinToBitMask(pin); clrw x - ld a, (0x0b, sp) -ld 0x0100,a + ld a, (3, sp) ld xl, a addw x, #(_digital_pin_to_bit_mask_PGM + 0) ld a, (x) -ld 0x0101,a ld yl,a ; yl = bit cpl a ld yh,a ; yh = ~bit + +; +; Zuordung pin => Port-ID +; ; pinmode-c.c: 10: uint8_t port = digitalPinToPort(pin); +; pinmode-c.c: 13: if (port == NOT_A_PORT) return; ; es könnte auch subw x, #(NUM_DIGITAL_PINS) sein clrw x - ld a, (0x0b, sp) + ld a, (3, sp) ld xl, a addw x, #(_digital_pin_to_port_PGM + 0) ld a, (x) ; port-ID. Z-Flag wird gesetzt -; pinmode-c.c: 13: if (port == NOT_A_PORT) return; -; jreq 00118$ + jreq 002$ ; ; Zuordung port-ID => Port-Addresse ; +; x = (GPIO_TypeDef *) portOutputRegister(port) +; 00102$: -; pinmode-c.c: 15: gpio = (GPIO_TypeDef *) portOutputRegister(port); -;****** clrw x sll a ; 8 bit shift is sufficient ld xl, a addw x, #(_port_to_output_PGM + 0) ldw x, (x) ; jetzt ist gpio in x -ldw 0x0102,x ; ; case INPUT +; gpio->CR2 &= ~bit; // first: deactivate interrupt +; gpio->CR1 &= ~bit; // release top side +; gpio->DDR &= ~bit; // now set direction ; -; pinmode-c.c: 17: if (mode == INPUT) { - ld a, (0x0c, sp) + ld a, (4, sp) jrne 00116$ -; pinmode-c.c: 19: gpio->CR2 &= ~bit; // first: deactivate interrupt -; pinmode-c.c: 20: gpio->CR1 &= ~bit; // release top side -; pinmode-c.c: 21: gpio->DDR &= ~bit; // now set direction sim BIT_CLEAR(CR2) BIT_CLEAR(CR1) BIT_CLEAR(DDR) rim - jp 00118$ +002$: ret ; ; case INPUT_PULLUP +; gpio->CR2 &= ~bit; // first: deactivate interrupt +; gpio->DDR &= ~bit; // set direction before +; gpio->CR1 |= bit; // activating the pull up ; 00116$: -; pinmode-c.c: 23: } else if (mode == INPUT_PULLUP) { cp a, #0x02 jrne 00113$ -; pinmode-c.c: 25: gpio->CR2 &= ~bit; // first: deactivate interrupt -; pinmode-c.c: 26: gpio->DDR &= ~bit; // set direction before -; pinmode-c.c: 27: gpio->CR1 |= bit; // activating the pull up + sim BIT_CLEAR(CR2) BIT_CLEAR(DDR) BIT_SET(CR1) rim - jp 00118$ + ret ; -; case OUTPUT_FAST +; case OUTPUT_FAST // output push-pull, fast +; gpio->CR1 |= bit; +; gpio->DDR |= bit; // direction before setting CR2 to +; gpio->CR2 |= bit; // avoid accidental interrupt ; 00113$: -; pinmode-c.c: 29: } else if (mode == OUTPUT_FAST) {// output push-pull, fast cp a, #0x05 jrne 00110$ -; pinmode-c.c: 31: gpio->CR1 |= bit; -; pinmode-c.c: 32: gpio->DDR |= bit; // direction before setting CR2 to -; pinmode-c.c: 33: gpio->CR2 |= bit; // avoid accidental interrupt sim BIT_SET(CR1) jra 010$ ; -; case OUTPUT_OD_FAST +; case OUTPUT_OD_FAST // output open drain, fast +; gpio->CR1 &= ~bit; +; gpio->DDR |= bit; // direction before setting CR2 to +; gpio->CR2 |= bit; // avoid accidental interrupt ; 00110$: -; pinmode-c.c: 35: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast cp a, #0x07 jrne 00107$ -; pinmode-c.c: 37: gpio->CR1 &= ~bit; -; pinmode-c.c: 38: gpio->DDR |= bit; // direction before setting CR2 to -; pinmode-c.c: 39: gpio->CR2 |= bit; // avoid accidental interrupt sim BIT_CLEAR(CR1) 010$: BIT_SET(DDR) BIT_SET(CR2) rim - jra 00118$ + ret ; -; case OUTPUT_OD +; case OUTPUT_OD // output open drain, slow +; gpio->CR1 &= ~bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; ; 00107$: -; pinmode-c.c: 41: } else if (mode == OUTPUT_OD) { // output open drain, slow cp a, #0x03 jrne 00104$ -; pinmode-c.c: 43: gpio->CR1 &= ~bit; -; pinmode-c.c: 44: gpio->CR2 &= ~bit; -; pinmode-c.c: 45: gpio->DDR |= bit; sim BIT_CLEAR(CR1) jra 004$ ; -; case default +; case default // +; gpio->CR1 |= bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; ; 00104$: -; pinmode-c.c: 49: gpio->CR1 |= bit; -; pinmode-c.c: 50: gpio->CR2 &= ~bit; -; pinmode-c.c: 51: gpio->DDR |= bit; sim BIT_SET(CR1) 004$: BIT_CLEAR(CR2) BIT_SET(DDR) rim -00118$: -; pinmode-c.c: 54: } - addw sp, #8 __endasm; } From 77a6f481c27cca38c4f4714d4bc39d84dec1988f Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 10 Jan 2019 16:20:47 +0100 Subject: [PATCH 32/59] consolitate the jump table, improve comments, more fine-grained reuse of code --- test/pinmode/pinmode-asm.c | 303 +++++++++---------------------------- 1 file changed, 74 insertions(+), 229 deletions(-) diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c index a7f8a24b..040f5f6f 100644 --- a/test/pinmode/pinmode-asm.c +++ b/test/pinmode/pinmode-asm.c @@ -56,7 +56,7 @@ __asm ld xl, a addw x, #(_digital_pin_to_port_PGM + 0) ld a, (x) ; port-ID. Z-Flag wird gesetzt - jreq 002$ + jreq 010$ ; @@ -64,7 +64,6 @@ __asm ; ; x = (GPIO_TypeDef *) portOutputRegister(port) ; - 00102$: clrw x sll a ; 8 bit shift is sufficient @@ -72,266 +71,112 @@ __asm addw x, #(_port_to_output_PGM + 0) ldw x, (x) ; jetzt ist gpio in x +; +; jump table/switch statement for mode parameter +; + ld a, (4, sp) + jreq 000$ + dec a + jreq 010$ + dec a + jreq 020$ + dec a + jreq 030$ + dec a ; there is no case 4 + dec a + jreq 050$ + dec a ; there is no case 6 + dec a + jreq 070$ + +; fallthrough into OUTPUT as the default case + +; +; case OUTPUT // 1: output, push-pull, slow +; gpio->CR1 |= bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; +; +010$: + sim +// BIT_SET(CR1) + ld a,yl + or a,(CR1,x) + jra 031$ + +; +; case OUTPUT_OD // 3: output open drain, slow +; gpio->CR1 &= ~bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; +; +030$: + sim +// BIT_CLEAR(CR1) + ld a,yh + and a,(CR1,x) +031$: ld (CR1,x),a + BIT_CLEAR(CR2) + BIT_SET(DDR) + rim + ret ; -; case INPUT +; case INPUT // 0: input, floating ; gpio->CR2 &= ~bit; // first: deactivate interrupt ; gpio->CR1 &= ~bit; // release top side ; gpio->DDR &= ~bit; // now set direction ; - ld a, (4, sp) - jrne 00116$ - +000$: sim - BIT_CLEAR(CR2) - BIT_CLEAR(CR1) - BIT_CLEAR(DDR) + BIT_CLEAR(CR2) ; first: deactivate interrupt + BIT_CLEAR(CR1) ; release top side + BIT_CLEAR(DDR) ; now set direction rim -002$: ret +001$: ret ; -; case INPUT_PULLUP +; case INPUT_PULLUP // 2: input, internal pull up active ; gpio->CR2 &= ~bit; // first: deactivate interrupt ; gpio->DDR &= ~bit; // set direction before ; gpio->CR1 |= bit; // activating the pull up ; -00116$: - cp a, #0x02 - jrne 00113$ - +020$: sim - BIT_CLEAR(CR2) - BIT_CLEAR(DDR) - BIT_SET(CR1) + BIT_CLEAR(CR2) ; first: deactivate interrupt + BIT_CLEAR(DDR) ; set direction before + BIT_SET(CR1) ; activating the pull up rim ret ; -; case OUTPUT_FAST // output push-pull, fast +; case OUTPUT_FAST // 5: output push-pull, fast ; gpio->CR1 |= bit; ; gpio->DDR |= bit; // direction before setting CR2 to ; gpio->CR2 |= bit; // avoid accidental interrupt ; -00113$: - cp a, #0x05 - jrne 00110$ - +050$: sim - BIT_SET(CR1) - jra 010$ +// BIT_SET(CR1) + ld a,yl + or a,(CR1,x) + jra 071$ ; -; case OUTPUT_OD_FAST // output open drain, fast +; case OUTPUT_OD_FAST // 7: output open drain, fast ; gpio->CR1 &= ~bit; ; gpio->DDR |= bit; // direction before setting CR2 to ; gpio->CR2 |= bit; // avoid accidental interrupt ; -00110$: - cp a, #0x07 - jrne 00107$ - - sim - BIT_CLEAR(CR1) -010$: BIT_SET(DDR) - BIT_SET(CR2) - rim - ret - -; -; case OUTPUT_OD // output open drain, slow -; gpio->CR1 &= ~bit; -; gpio->CR2 &= ~bit; -; gpio->DDR |= bit; -; -00107$: - cp a, #0x03 - jrne 00104$ - - sim - BIT_CLEAR(CR1) - jra 004$ - -; -; case default // -; gpio->CR1 |= bit; -; gpio->CR2 &= ~bit; -; gpio->DDR |= bit; -; -00104$: +070$: sim - BIT_SET(CR1) -004$: BIT_CLEAR(CR2) +// BIT_CLEAR(CR1) + ld a,yh\ + and a,(CR1,x)\ +071$: ld (CR1,x),a BIT_SET(DDR) + BIT_SET(CR2) rim __endasm; } - -/* -void pinMode_asm(uint8_t pin, uint8_t mode) -{ - (void) pin; // empty code to avoid warning - (void) mode; -__asm - sub sp, #16 -#if 1 -; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); - clrw x - - ld a,(0x03, sp) - ld xl,a - addw x, #_digital_pin_to_bit_mask_PGM+0 - ld a, (x) ; bit - ld yl,a ; yl = bit - cpl a - ld yh,a ; yh = ~bit - -; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); -;;hier addw x, #_digital_pin_to_bit_mask_PGM - _digital_pin_to_bit_mask_PGM - ld a, (x) ; port - jreq 00018$ - - sll a - clrw x - ld xl,a - addw x, #_port_to_output_PGM+0 ; x = gpio - - ld a,(0x04,sp) ; a = mode, flags are set -#else -; pinmode.c: 10: uint8_t bit = digitalPinToBitMask(pin); - ldw x, #_digital_pin_to_bit_mask_PGM+0 - ld a, xl - add a, (0x13, sp) - rlwa x - adc a, #0x00 - ld xh, a - ld a, (x) - ld (0x04, sp), a ; bit := 4 -; pinmode.c: 11: uint8_t port = digitalPinToPort(pin); - ldw x, #_digital_pin_to_port_PGM+0 - ld a, xl - add a, (0x13, sp) - rlwa x - adc a, #0x00 - ld xh, a - ld a, (x) - ld (0x03, sp), a - ld a, (0x03, sp) - ld (0x07, sp), a ; port := 7 -; pinmode.c: 14: if (port == NOT_A_PIN) return; - tnz (0x03, sp) - jrne 00002$ - jp 00018$ -00002$: -; pinmode.c: 16: gpio = (GPIO_TypeDef *) portOutputRegister(port); - ldw x, #_port_to_output_PGM+0 - ldw (0x0e, sp), x - ld a, (0x07, sp) - ld xl, a - ld a, #0x02 - mul x, a - addw x, (0x0e, sp) - ldw x, (x) ; jetzt ist gpio in x - - ld a, (0x04, sp) ; bit - ld yl,a ; yl = bit - cpl a - ld yh,a ; yh = ~bit - ld a, (0x14, sp) ; a=mode, flags are set -#endif - -; gpio->DDR: (2,x) (war an c,SP) -; gpio->CR1: (3,x) (war an 8,SP) -; gpio->CR2: (4,x) (war an 5,SP) - - sim -; pinmode.c: 18: if (mode == INPUT) { - jrne 00016$ -; pinmode.c: 20: gpio->CR2 &= ~bit; // first: deactivate interrupt - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 21: gpio->CR1 &= ~bit; // release top side - ld a,yh - and a,(3,x) - ld (3,x),a -; pinmode.c: 22: gpio->DDR &= ~bit; // now set direction - ld a,yh - and a,(2,x) - jp 00022$ - -00016$: -; pinmode.c: 24: } else if (mode == INPUT_PULLUP) { - cp a, #0x02 - jrne 00013$ -; pinmode.c: 26: gpio->CR2 &= ~bit; // first: deactivate interrupt - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 27: gpio->DDR &= ~bit; // set direction before - ld a,yh -and a,(2,x) - ld (2,x),a -; pinmode.c: 28: gpio->CR1 |= bit; // activating the pull up - ld a,yl - or a,(3,x) - ld (3,x),a - jp 00018$ - -00013$: -; pinmode.c: 30: } else if (mode == OUTPUT_FAST) {// output push-pull, fast - cp a, #0x05 - jrne 00010$ -; pinmode.c: 32: gpio->CR1 |= bit; - ld a,yl - or a,(3,x) - jra 00020$ -; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to -; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt -00010$: -; pinmode.c: 36: } else if (mode == OUTPUT_OD_FAST) { // output open drain, fast - cp a, #0x07 - jrne 00007$ -; pinmode.c: 38: gpio->CR1 &= ~bit; - ld a,yh - and a,(3,x) -00020$: ld (3,x),a -; pinmode.c: 39: gpio->DDR |= bit; // direction before setting CR2 to - ld a,yl - or a,(2,x) - ld (2,x),a -; pinmode.c: 40: gpio->CR2 |= bit; // avoid accidental interrupt - ld a,yl - or a,(4,x) - ld (4,x),a - jra 00018$ - -00007$: -; pinmode.c: 42: } else if (mode == OUTPUT_OD) { // output open drain, slow - cp a, #0x03 - jrne 00004$ -; pinmode.c: 44: gpio->CR1 &= ~bit; - ld a,yh - and a,(3,x) - jra 00021$ -; pinmode.c: 45: gpio->CR2 &= ~bit; -; pinmode.c: 46: gpio->DDR |= bit; -00004$: -; pinmode.c: 50: gpio->CR1 |= bit; - ld a,yl - or a,(3,x) -00021$: ld (3,x),a -; pinmode.c: 51: gpio->CR2 &= ~bit; - ld a,yh - and a,(4,x) - ld (4,x),a -; pinmode.c: 52: gpio->DDR |= bit; - ld a,yl - or a,(2,x) -00022$: ld (2,x),a -00018$: - rim - addw sp, #16 -__endasm; -} -*/ From 4fd88adae45be259bcc1e56b1e0a7bfac51ea243 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 10 Jan 2019 20:22:30 +0100 Subject: [PATCH 33/59] fix wrong jump in error case, optimize table access, 147 bytes --- test/pinmode/pinmode-asm.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/pinmode/pinmode-asm.c b/test/pinmode/pinmode-asm.c index 040f5f6f..65c42d00 100644 --- a/test/pinmode/pinmode-asm.c +++ b/test/pinmode/pinmode-asm.c @@ -39,6 +39,7 @@ __asm clrw x ld a, (3, sp) ld xl, a + pushw x addw x, #(_digital_pin_to_bit_mask_PGM + 0) ld a, (x) ld yl,a ; yl = bit @@ -51,12 +52,10 @@ __asm ; pinmode-c.c: 10: uint8_t port = digitalPinToPort(pin); ; pinmode-c.c: 13: if (port == NOT_A_PORT) return; ; es könnte auch subw x, #(NUM_DIGITAL_PINS) sein - clrw x - ld a, (3, sp) - ld xl, a + popw x addw x, #(_digital_pin_to_port_PGM + 0) ld a, (x) ; port-ID. Z-Flag wird gesetzt - jreq 010$ + jreq 032$ ; if (port == NOT_A_PORT) return; ; @@ -119,7 +118,7 @@ __asm BIT_CLEAR(CR2) BIT_SET(DDR) rim - ret +032$: ret ; ; case INPUT // 0: input, floating From 115adbc34435b3ae4f9178fb16b11b18953a0588 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 10 Jan 2019 20:50:37 +0100 Subject: [PATCH 34/59] integrate the optimized pinMode() implementation, fix#4 --- CHANGELOG.md | 2 + .../stm8/cores/sduino/wiring_digital.c-4.c | 235 +++++++++++++++--- 2 files changed, 207 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f1c9897..875bf8b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - a simple regression test script test/make-test.sh to compile all examples ### Changed +- reduced binary size by splitting some Arduino core files +- reduced binary size by optimizing the pinMode() implementation - using busybox as command shell for windows to run the wrapper scripts ### Fixed diff --git a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c index 483bd0a3..0cf5b329 100644 --- a/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c +++ b/sduino/hardware/sduino/stm8/cores/sduino/wiring_digital.c-4.c @@ -2,43 +2,20 @@ /** * set the input or output mode of a pin */ -/* arduino-style pinMode -void pinMode(uint8_t pin, uint8_t mode) -{ - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - volatile uint8_t *reg, *out; - - if (port == NOT_A_PIN) return; - - reg = portModeRegister(port); - out = portOutputRegister(port); - - if (mode == INPUT) { - BEGIN_CRITICAL - *reg &= ~bit; - *out &= ~bit; - END_CRITICAL - } else if (mode == INPUT_PULLUP) { - BEGIN_CRITICAL - *reg &= ~bit; - *out |= bit; - END_CRITICAL - } else { - BEGIN_CRITICAL - *reg |= bit; - END_CRITICAL - } -} -*/ +#ifdef DONT_USE_ASSEMBLER +/*** + * Arduino-style pinMode + * + * This version compiles to 270 bytes. + */ void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile GPIO_TypeDef *gpio; - if (port == NOT_A_PIN) return; + if (port == NOT_A_PORT) return; gpio = (GPIO_TypeDef *) portOutputRegister(port); @@ -81,6 +58,204 @@ void pinMode(uint8_t pin, uint8_t mode) } } +#else + +/*** + * Hand-crafted and optimized assembler version of pinMode + * + * This version compiles to 147 bytes. + */ +#define DDR 2 +#define CR1 3 +#define CR2 4 + +#define BIT_CLEAR(REG) \ + ld a,yh\ + and a,(REG,x)\ + ld (REG,x),a + +#define BIT_SET(REG) \ + ld a,yl\ + or a,(REG,x)\ + ld (REG,x),a + + +void pinMode(uint8_t pin, uint8_t mode) +{ + (void) pin; // empty code to avoid warning + (void) mode; +__asm + +; +; position of the parameters on the stack: +; (3,sp) pin +; (4,sp) mode +; + +; +; mapping pin => bit mask +; + +; pinmode-c.c: 9: uint8_t bit = digitalPinToBitMask(pin); + clrw x + ld a, (3, sp) + ld xl, a + pushw x + addw x, #(_digital_pin_to_bit_mask_PGM + 0) + ld a, (x) + ld yl,a ; yl = bit + cpl a + ld yh,a ; yh = ~bit + +; +; mapping pin => port-ID +; +; The distance between the tables _digital_pin_to_bit_mask_PGM and +; _digital_pin_to_port_PGM is known and constant, but I couldn't find a way +; to do the math through the linker without defining a dummy variable. +; +; The constant NUM_DIGITAL_PINS could be used, but that requires that these +; two tables are always defined right after each other in all pins_arduino.h +; versions. This is possible, but a potential pitfall in the future. +; +; If this distance could be communicated into this module, a simple +; addw x, #(distance) could calculate the table start address. +; +; The second best way is reusing at least the offset part. Only 2 extra +; bytes and full flexibility. + +; pinmode-c.c: 10: uint8_t port = digitalPinToPort(pin); +; pinmode-c.c: 13: if (port == NOT_A_PORT) return; + popw x + addw x, #(_digital_pin_to_port_PGM + 0) + ld a, (x) ; port-ID. Z-Flag wird gesetzt + jreq 032$ ; if (port == NOT_A_PORT) return; + + +; +; mapping port-ID => Port-Addresse +; +; x = (GPIO_TypeDef *) portOutputRegister(port) +; +00102$: + clrw x + sll a ; 8 bit shift is sufficient + ld xl, a + addw x, #(_port_to_output_PGM + 0) + ldw x, (x) ; jetzt ist gpio in x + +; +; jump table/switch statement for mode parameter +; + ld a, (4, sp) + jreq 000$ + dec a + jreq 010$ + dec a + jreq 020$ + dec a + jreq 030$ + dec a ; there is no case 4 + dec a + jreq 050$ + dec a ; there is no case 6 + dec a + jreq 070$ + +; fallthrough into OUTPUT as the default case + +; +; case OUTPUT // 1: output, push-pull, slow +; gpio->CR1 |= bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; +; +010$: + sim +// BIT_SET(CR1) + ld a,yl + or a,(CR1,x) + jra 031$ + +; +; case OUTPUT_OD // 3: output open drain, slow +; gpio->CR1 &= ~bit; +; gpio->CR2 &= ~bit; +; gpio->DDR |= bit; +; +030$: + sim +// BIT_CLEAR(CR1) + ld a,yh + and a,(CR1,x) +031$: ld (CR1,x),a + BIT_CLEAR(CR2) + BIT_SET(DDR) + rim +032$: ret + +; +; case INPUT // 0: input, floating +; gpio->CR2 &= ~bit; // first: deactivate interrupt +; gpio->CR1 &= ~bit; // release top side +; gpio->DDR &= ~bit; // now set direction +; +000$: + sim + BIT_CLEAR(CR2) ; first: deactivate interrupt + BIT_CLEAR(CR1) ; release top side + BIT_CLEAR(DDR) ; now set direction + rim +001$: ret + +; +; case INPUT_PULLUP // 2: input, internal pull up active +; gpio->CR2 &= ~bit; // first: deactivate interrupt +; gpio->DDR &= ~bit; // set direction before +; gpio->CR1 |= bit; // activating the pull up +; +020$: + sim + BIT_CLEAR(CR2) ; first: deactivate interrupt + BIT_CLEAR(DDR) ; set direction before + BIT_SET(CR1) ; activating the pull up + rim + ret + +; +; case OUTPUT_FAST // 5: output push-pull, fast +; gpio->CR1 |= bit; +; gpio->DDR |= bit; // direction before setting CR2 to +; gpio->CR2 |= bit; // avoid accidental interrupt +; +050$: + sim +// BIT_SET(CR1) + ld a,yl + or a,(CR1,x) + jra 071$ + +; +; case OUTPUT_OD_FAST // 7: output open drain, fast +; gpio->CR1 &= ~bit; +; gpio->DDR |= bit; // direction before setting CR2 to +; gpio->CR2 |= bit; // avoid accidental interrupt +; +070$: + sim +// BIT_CLEAR(CR1) + ld a,yh\ + and a,(CR1,x)\ +071$: ld (CR1,x),a + BIT_SET(DDR) + BIT_SET(CR2) + rim + +__endasm; +} +#endif + + /* using an array of pointers compiles way more efficient than doing simple * pointer arithmetics like * From 2dfc4893ab9955a564aced141fae7f15353f05a9 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Fri, 11 Jan 2019 11:33:04 +0100 Subject: [PATCH 35/59] update docs, add info about cross-compilation and SPL splitting --- docs/developer/coding-style.md | 34 ++++++++ docs/developer/cross-compile-for-osx.md | 102 ++++++++++++++++++++++++ docs/developer/links.md | 4 + docs/developer/optimizations.md | 92 +++++++++++++++++++++ docs/developer/spl.md | 43 +++------- mkdocs.yml | 3 + 6 files changed, 248 insertions(+), 30 deletions(-) create mode 100644 docs/developer/coding-style.md create mode 100644 docs/developer/cross-compile-for-osx.md create mode 100644 docs/developer/optimizations.md diff --git a/docs/developer/coding-style.md b/docs/developer/coding-style.md new file mode 100644 index 00000000..865de348 --- /dev/null +++ b/docs/developer/coding-style.md @@ -0,0 +1,34 @@ +# Coding style + +## Development workflow + +I recently read this great article about [a successful branching +model](https://nvie.com/posts/a-successful-git-branching-model/) for git and +will implement it. Highly recommended! + + +## Changelog + +Every feature branch (or pull request) should include an update for +Changelog.md + + +## Code format + +When porting an existing Arduino library I try to preserve the original +formatting as much as possible to allow for easy comparison to the original +state. + +There is a development of a C++ capable compiler environment going on. There +is no public website for that project yet, but I am in contact with the +developer. He is even targeting Sduino for his project and at one point in +the (still distant) future we might be able to switch back to the orginal +library code again. Preserved code structure would be a big plus then. (But +don't hold your breath yet) + +Newly written code is mostly formatted using indent according to the linux +kernel coding style, using Tabs, Tab width 8, line length 80: + +```bash +indent -linux +``` diff --git a/docs/developer/cross-compile-for-osx.md b/docs/developer/cross-compile-for-osx.md new file mode 100644 index 00000000..f7d8c936 --- /dev/null +++ b/docs/developer/cross-compile-for-osx.md @@ -0,0 +1,102 @@ +# Cross-Compile for OSX + +Compiling the tools is really easy. Only setting up the cross compilation +environment requires a little more effort. But luckily, the +[osxcross](https://github.com/tpoechtrager/osxcross) project already took +care of this. + + +## Setting up the cross compilation environment on Linux Mint 19 + +### Install the needed dependencies + +I needed only these (the others were already present): + + sudo apt install clang llvm-dev uuid-dev libssl-dev libbz2-dev + +Full list of all dependencies: + + sudo apt install clang llvm-dev libxml2-dev uuid-dev libssl-dev bash patch make tar xz-utils bzip2 gzip sed cpio libbz2-dev + + +### Get the MacOSX SDK + +#### The official way + +Extract the needed files from the official SDKs Xcode 7.3 from the Apple +Developer website using the scripts that come with osxcross: + + sudo apt install cmake libxml2-dev fuse libfuse-dev + ./tools/gen_sdk_package_darling_dmg.sh path/to/SDK-file + +On Ubuntu-based distributions with a name not containing the string "ubuntu" +(like Linux Mint) you will get an error message "Required kernel module +'fuse' not loaded". To fix this, "echo out" the line `modinfo fuse +&>/dev/null` in tools/gen_sdk_package_darling_dmg.sh by changing it to `echo +modinfo fuse &>/dev/null` before running it (don't delete it or comment it +out). + + +```diff +diff --git a/tools/gen_sdk_package_darling_dmg.sh b/tools/gen_sdk_package_darling_dmg.sh +index 8cd23e5..b271450 100755 +--- a/tools/gen_sdk_package_darling_dmg.sh ++++ b/tools/gen_sdk_package_darling_dmg.sh +@@ -40,7 +40,7 @@ command -v lsb_release 2>&1 > /dev/null + if [[ $? -eq 0 ]] && [[ -n $(lsb_release -a 2>&1 | grep -i ubuntu) ]]; then + echo "Using ubuntu, skipping fuse module check" + else +- modinfo fuse &>/dev/null ++ echo modinfo fuse &>/dev/null + fi + + if [ $? -ne 0 ]; then +``` + +Now move the resulting file `MacOSX10.11.sdk.tar.xz` into the tarball directory. + + + +#### The easy way + +Somebody was kind enough to set up a repository with all the [MacOSX +SDKs](https://github.com/phracker/MacOSX-SDKs). This saves you the trouble +of downloading multiple gigabytes of data and running the extraction script. + +Download the file +[MacOSX10.11.sdk.tar.xz](https://github.com/phracker/MacOSX-SDKs/releases/download/10.13/MacOSX10.11.sdk.tar.xz) +into the tarball directory. + + + + + +### Build OSXcross: + + ./build.sh + sudo mv target /opt/osxcross + +Add `/opt/osxcross/bin` to your `$PATH` and prepare macports: + + export MACOSX_DEPLOYMENT_TARGET=10.7 + export PATH=$PATH:/opt/osxcross/bin + osxcross-macports update-cache + + + +## Build stm8flash + + osxcross-macports install libusb-devel + make CC=o64-clang CXX=o64-clang++ PKGCONFIG=x86_64-apple-darwin15-pkg-config RELEASE=yes + +Or with full path if you didn't add the osxcross binary directory do your +PATH: + + make CC=/opt/osxcross/bin/o64-clang CXX=/opt/osxcross/bin/o64-clang++ PKGCONFIG=/opt/osxcross/bin/x86_64-apple-darwin15-pkg-config RELEASE=yes + + +## Build stm8gal + + make CC=o64-clang + +That's all! diff --git a/docs/developer/links.md b/docs/developer/links.md index 58a05980..99c224bd 100644 --- a/docs/developer/links.md +++ b/docs/developer/links.md @@ -2,6 +2,10 @@ ## Further reading and application notes +A very good and compact primer on +[STM8S-Programming](https://github.com/TG9541/stm8ef/wiki/STM8S-Programming). +Does not rely on any external libraries. + [A series of articles](https://lujji.github.io/blog/bare-metal-programming-stm8/) on bare metal programming of the STM8S CPUs. By far the best introduction I diff --git a/docs/developer/optimizations.md b/docs/developer/optimizations.md new file mode 100644 index 00000000..5f24d054 --- /dev/null +++ b/docs/developer/optimizations.md @@ -0,0 +1,92 @@ +# Optimizations + +The goal is to reduce the size of the generated binaries. This is done by +aiding the linker to eleminate dead code by splitting large source files and +by hand-optimizing individual functions. + +## Results + +The sum of all these optimizations reduces the total size of Blink.ino by +more than 30%, saving more than 800 bytes of precious flash space: + + code | data| RAM| flash total |split stage + ---- | ----| ----| ---- |------------ + 2507 | 138| 72| 2645 |before split + 2450 | 138| 72| 2588 |after splitting wiring.c + 2381 | 138| 72| 2519 |after splitting wiring_digital.c + 1799 | 138| 72| 1937 |after splitting HardwareSerial.c + 1686 | 138| 72| 1824 |after optimizing pinMode() + +Data is mostly the tables to map the Arduino pin numbers to the actual port +registers. RAM is mostly the transmit and receive buffers for serial +communication. These can't easily be optimized out. + + +## Splitting files + +The SDCC linker does not detect unused functions and constants in an object +file. It always links the whole file even if only a single symbol contained +in the file is referenced. This results in pretty bloated binaries if the +SPL is used. + +Splitting larger source files into smaller units and compile them +individually before building the libraries helps the SDCC linker to +eleminate dead code and to produce smaller binaries. + +Splitting files is worthwhile for all SPL files and at least some of the +bigger Arduino core files. + + +### The stategy + +The SPL consists of many source files with a very regular structure. This +allows to automate the splitting process with very little preparation work. + +All SPL functions are documented with a doxygen comment block. The beginning +of this comment block is a line with only "/**", that can easily be used as +a marker for splitting the files. + +Only the very first block is special. It contains definitions and prototypes +that are needed all over the module. This block is saved as a `.h` file and +`#include`'d by all the following blocks. + +In most cases this is already sufficient. Only in very rare cases the +position of a split needs the be edited. This is automatically done by the +patches in the `patches/` directory. + +**To prevent a split**: Change the `/**` line into something different, `/***` +is used in the scripts. + +**To force a split**: Add an empty Doxygen comment block: +```c +/** + */ +``` + + +### Splitting the SPL files + +Splitting and compiling the SPL libraries is moved into the separate project +[spl-splitter](https://github.com/tenbaht/spl-splitter) now. + + + +### Split Arduino core files + +`wiring.c`, `wiring_digital.c` and `HardwareSerial.c` all compile into quite +large binaries. All of them are linked with almost +every project. This is true even if no serial communication is used since +main.c references `serialEvent()` and this way pulls in all of +HardwareSerial. + +Splitting these three files reduces the size of simple sketches +significantly. It does not help so much for complex sketches that use almost +all functions of these modules. + + + +## Optimizing individual functions + +`pinMode()` sticks out when looking at the size of individual functions. 270 +bytes for just setting the IO-mode of a pin. A re-write in assember reduces +this to just 147 bytes. diff --git a/docs/developer/spl.md b/docs/developer/spl.md index a4efb1d4..d30b08ec 100644 --- a/docs/developer/spl.md +++ b/docs/developer/spl.md @@ -10,38 +10,20 @@ zip file. This and [Lujji's blog](https://lujji.github.io/blog/bare-metal-programming-stm8/) is the most useful reference on using this library and programming the STM8 in general. -For use with SDCC the library needs to be patched: +For use with SDCC the library needs to be patched with Georg's [SPL-SDCC +patches](https://github.com/gicking/STM8-SPL_SDCC_patch): ```bash -git clone https://github.com/g-gabber/STM8S_StdPeriph_Driver.git -git clone https://github.com/gicking/SPL_2.2.0_SDCC_patch.git -cp ../STM8S_SPL_2.2.0/Libraries/STM8S_StdPeriph_Driver/inc/stm8s.h . -patch -p1 < ../SPL_2.2.0_SDCC_patch/STM8_SPL_v2.2.0_SDCC.patch -cp -av ../STM8S_StdPeriph_Lib/Project/STM8S_StdPeriph_Template/stm8s_conf.h . -cp -av ../STM8S_StdPeriph_Lib/Project/STM8S_StdPeriph_Template/stm8s_it.h . +unzip en.stsw-stm8069.zip +wget https://raw.githubusercontent.com/gicking/STM8-SPL_SDCC_patch/master/STM8S_StdPeriph_Lib_V2.3.1_sdcc.patch +patch -p0 < STM8S_StdPeriph_Lib_V2.3.1_sdcc.patch ``` -SDCC uses .rel as the file extension for its object files. +Check out the test project and the project template in +`STM8S_StdPeriph_Lib/Project/STM8S_StdPeriph_test` and +`STM8S_StdPeriph_Lib/Project/STM8S_StdPeriph_Template` -Additional patch required for stm8s_itc.c: - -```diff ---- stm8s_itc.c~ 2014-10-21 17:32:20.000000000 +0200 -+++ stm8s_itc.c 2016-12-11 21:56:41.786048494 +0100 -@@ -55,9 +55,12 @@ - return; /* Ignore compiler warning, the returned value is in A register */ - #elif defined _RAISONANCE_ /* _RAISONANCE_ */ - return _getCC_(); --#else /* _IAR_ */ -+#elif defined _IAR_ /* _IAR_ */ - asm("push cc"); - asm("pop a"); /* Ignore compiler warning, the returned value is in A register */ -+#else /* _SDCC_ */ -+ __asm__("push cc"); -+ __asm__("pop a"); /* Ignore compiler warning, the returned value is in A register */ - #endif /* _COSMIC_*/ - } -``` +SDCC uses .rel as the file extension for its object files. @@ -79,14 +61,15 @@ clean: This library can now be used for linking with blink_spl or uart_spl. The files stm8s_conf.h and stm8s_it.h are still needed for compilation. + +### Optimizing the code + The linker does not remove individual unused functions from an object file, only complete object files can be skipped. **=> for building a library it is better to separate all functions into individual source files ** -The SPL folder in this archive contains a script `doit` to separate the -functions before compilation. -FIXME: description needed +See [here](../optimizations/#splitting-files) for details. A suggestion how to move at least the IRQ vectors away from the libray into the own source files: diff --git a/mkdocs.yml b/mkdocs.yml index 67f64020..0dcc240d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,12 +41,15 @@ nav: - Developer Guide: - IDE integration: 'developer/ide-integration.md' - Compiling the tools: 'developer/compiling-the-tools.md' + - Cross-compiling the tools for OSX: 'developer/cross-compile-for-osx.md' - Update an automatic installation to a manual installation: 'developer/update-to-manual.md' - C preprocessor macro magic: 'developer/macro.md' - Ways to define a pin mapping: 'developer/pin_mapping.md' + - Coding style: 'developer/coding-style.md' - Using the SDCC compiler: 'developer/sdcc.md' - Using the SPL with SDCC and sduino: 'developer/spl.md' - Bare metal programming on the STM8: 'developer/bare-metal-programming.md' + - Optimizations: 'developer/optimizations.md' - Performance comparison and benchmarking: 'developer/performance.md' - Links and further reading: 'developer/links.md' - Contact: contact.md From 7a58dcc8585be15baa06b6296d43608a77f8bef9 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Fri, 11 Jan 2019 17:35:31 +0100 Subject: [PATCH 36/59] mention the STM8S001 --- .../stm8/STM8S_StdPeriph_Driver/README.md | 25 +++++++++--------- .../STM8S_StdPeriph_Driver/peripherie.ods | Bin 17217 -> 18271 bytes .../STM8S_StdPeriph_Driver/peripherie.png | Bin 24944 -> 47733 bytes 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md index 80e60e90..d4b606d9 100644 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md +++ b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md @@ -5,14 +5,6 @@ all of this might be moved to this location at a later stage of the project: hardware/tools/stm8/STM8S_StdPeriph_Driver -## STM8S903 and STM8AF622x - -The definitions for these two (uncommon) CPUs are flawed in the original -versions of the SPL. `inc/stm8s.h` needs -[this patch](correct_stm8s908.patch) if you start from -scratch with the stock SPL files from the ST website. - - ## Supported CPUs The script in `tools/showdeps.sh` lists the known CPU names defined in @@ -20,7 +12,7 @@ inc/stm8s.h. Some CPUs use identical libraries: Product line | supported CPU types per library ---------------------------------- | --------------------------- -| Low density devices | STM8S003, STM8S103 +| Low density devices | STM8S001, STM8S003, STM8S103 | Medium density devices | STM8S005, STM8S105, STM8AF626x | High density devices without CAN | STM8S007, STM8S207, STM8AF62Ax | High density devices with CAN | STM8S208, STM8AF52Ax @@ -30,9 +22,9 @@ Product line | supported CPU types per library Supported peripherie for the different CPUs: -CPU |STM8S003|STM8S005 |STM8S007 |STM8S208 |STM8S903 | - |STM8S103|STM8S105 |STM8S207 | | | -Module | |STM8AF626x|STM8AF62Ax |STM8AF52Ax| |STM8AF622x +CPU |STM8S001|STM8S005 |STM8S007 |STM8S208 |STM8S903 | + |STM8S003|STM8S105 |STM8S207 | | | +Module |STM8S103|STM8AF626x|STM8AF62Ax |STM8AF52Ax| |STM8AF622x ------ |:-----:|:------: |:------: |:------: |:------: | stm8s_adc1.c|+ |+ | | |+ |+ stm8s_adc2.c| | |+ |+ | | @@ -63,6 +55,15 @@ stm8s_wwdg.c|+ |+ |+ |+ |+ |+ ![Table of supported peripherie per CPU](peripherie.png) +## STM8S903 and STM8AF622x + +The definitions for these two (uncommon) CPUs are flawed in the original +versions of the SPL. `inc/stm8s.h` needs +[this patch](correct_stm8s908.patch) if you start from +scratch with the stock SPL files from the ST website. + + + ## Recycle bin Some (maybe) useful leftovers. These code snipplets might be useful again diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/peripherie.ods b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/peripherie.ods index 968eb5614e8dc7bcfcc429843a39ff70ad058c0f..4677ccb9a7c6202ba2657e8255b1e708d8db05ae 100644 GIT binary patch delta 16893 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 z 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 delta 15794 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 df6eFLRR-rj7-(2a} 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 Date: Fri, 11 Jan 2019 18:09:58 +0100 Subject: [PATCH 37/59] move the split- and compilation scripts into the new repository spl-splitter --- CHANGELOG.md | 1 + .../stm8/STM8S_StdPeriph_Driver/README.md | 11 +- .../stm8/STM8S_StdPeriph_Driver/compilelib.sh | 85 ---------- .../correct_stm8s908.patch | 21 --- .../stm8/STM8S_StdPeriph_Driver/src/Makefile | 49 ------ .../stm8/STM8S_StdPeriph_Driver/src/doit | 44 ----- .../src/spl-splitprepare.patch | 150 ------------------ .../STM8S_StdPeriph_Driver/tools/showdeps.sh | 33 ---- .../STM8S_StdPeriph_Driver/use_stdint_h.patch | 22 --- 9 files changed, 8 insertions(+), 408 deletions(-) delete mode 100755 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/compilelib.sh delete mode 100644 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/correct_stm8s908.patch delete mode 100644 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/Makefile delete mode 100755 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/doit delete mode 100644 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/spl-splitprepare.patch delete mode 100755 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/tools/showdeps.sh delete mode 100644 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/use_stdint_h.patch diff --git a/CHANGELOG.md b/CHANGELOG.md index 875bf8b4..bd051277 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - reduced binary size by splitting some Arduino core files - reduced binary size by optimizing the pinMode() implementation - using busybox as command shell for windows to run the wrapper scripts +- move the SPL compilation scripts into a separate project spl-splitter ### Fixed - building the core library when using make (regression bug in 0.4.0) diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md index d4b606d9..2698e989 100644 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md +++ b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/README.md @@ -1,7 +1,11 @@ # Compiling the ST Standard Peripheral Library SPL +The actual compiler scripts are now a project on their own: +[spl-splitter](https://github.com/tenbaht/spl-splitter). The source files in +src/ are still kept here for reference, but they might be removed later as +they are not required anymore for compilation. -all of this might be moved to this location at a later stage of the project: +All of this might be moved to this location at a later stage of the project: hardware/tools/stm8/STM8S_StdPeriph_Driver @@ -58,9 +62,8 @@ stm8s_wwdg.c|+ |+ |+ |+ |+ |+ ## STM8S903 and STM8AF622x The definitions for these two (uncommon) CPUs are flawed in the original -versions of the SPL. `inc/stm8s.h` needs -[this patch](correct_stm8s908.patch) if you start from -scratch with the stock SPL files from the ST website. +versions of the SPL. The patch for `inc/stm8s.h` is now part of the +[STM8-SPL_SDCC_patch](https://github.com/gicking/STM8-SPL_SDCC_patch). diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/compilelib.sh b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/compilelib.sh deleted file mode 100755 index 4f8d2c65..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/compilelib.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -## parameter check - -if [ $# -ne 1 ]; then - cat << EOF -split the library into individual source files for every single function, -compile them seperately and pack them all together into one big library. - -usage: $0 cputype - -supported cpu types: - Low density devices: STM8S003, STM8S103 - Medium density devices: STM8S005, STM8S105, STM8AF626x - High density devices without CAN: STM8S007, STM8S207, STM8AF62Ax - High density devices with CAN: STM8S208, STM8AF52Ax - App. specific low density devices:STM8S903, STM8AF622x -EOF - exit 1 -fi - -CPU=$1 - - -### main part starts here - - -# define the compile parameter -CC="sdcc" -AR="sdar" -CFLAGS="-mstm8 -D${CPU} -I ../inc -I ../src --opt-code-size -I." -LDFLAGS="-rc" - -BUILDDIR="build-${CPU}" - - - -# name of the library: $CPU.lib in lower case -LIBRARY=$(echo ${CPU}|tr '[:upper:]' '[:lower:]').lib - -# check the dependencies, generate the list of needed c source files -HFILES=$($CC -mstm8 -Iinc -Isrc -D$CPU "-Wp-MM" -E inc/stm8s.h|fmt -1|sed -n 's, *inc/stm8s_,stm8s_,p') -CFILES=${HFILES//.h/.c} - -# debug output -echo "Needed source code modules for CPU $CPU:" -echo $CFILES -echo "Library name: $LIBRARY" -echo "cflags: $CFLAGS" - - -# the most important function: split on c source file in to a collection -# of single-function source files. -splitit() { - awk "/\/\*\*\r/{n++; file=\"$1-\" n \".c\";print \"#include \\\"$1.h\\\"\">file}{print >file }" ../src/$1 - sed "1 d" $1-1.c > $1.h - rm $1-1.c -} - - -# prepare a fresh build directory -#BUILDDIR=$(mktemp -dp.) -rm -rf $BUILDDIR -mkdir $BUILDDIR -cd $BUILDDIR -echo "using $BUILDDIR" - -# split all needed source files into single-function source files -for i in $CFILES; do - splitit $i; -done - -# compile all split files -#cp ../compilelib.mk Makefile -#make CPU=$CPU -for i in stm8s*.c; do - echo "compiling $i" - ${CC} ${CFLAGS} -c $i || break -done - -# build the library -${AR} ${LDFLAGS} ../lib/${LIBRARY} *.rel - -# get the generated library -#mv *.lib .. diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/correct_stm8s908.patch b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/correct_stm8s908.patch deleted file mode 100644 index 4c9a8778..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/correct_stm8s908.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/STM8S_StdPeriph_Driver/src/stm8s_conf.h b/STM8S_StdPeriph_Driver/src/stm8s_conf.h -index 111047b..152fdfb 100644 ---- a/STM8S_StdPeriph_Driver/src/stm8s_conf.h -+++ b/STM8S_StdPeriph_Driver/src/stm8s_conf.h -@@ -56,14 +56,14 @@ - #include "stm8s_rst.h" - #include "stm8s_spi.h" - #include "stm8s_tim1.h" --#if !defined(STM8S903) || !defined(STM8AF622x) -+#if !defined(STM8S903) && !defined(STM8AF622x) - #include "stm8s_tim2.h" - #endif /* (STM8S903) || (STM8AF622x) */ - #if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) ||\ - defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined (STM8AF626x) - #include "stm8s_tim3.h" - #endif /* (STM8S208) ||defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) */ --#if !defined(STM8S903) || !defined(STM8AF622x) -+#if !defined(STM8S903) && !defined(STM8AF622x) - #include "stm8s_tim4.h" - #endif /* (STM8S903) || (STM8AF622x) */ - #if defined(STM8S903) || defined(STM8AF622x) diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/Makefile b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/Makefile deleted file mode 100644 index 9bd61fe8..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -CC=sdcc -AR=sdar -CFLAGS=-c -mstm8 -DSTM8S103 -I ../../inc -I../../src --opt-code-size -I. -LDFLAGS=-rc -SOURCES=$(wildcard stm*.c) - -LIBSOURCES= \ -stm8s_adc1.c \ -stm8s_awu.c \ -stm8s_beep.c \ -stm8s_clk.c \ -stm8s_exti.c \ -stm8s_flash.c \ -stm8s_gpio.c \ -stm8s_i2c.c \ -stm8s_itc.c \ -stm8s_iwdg.c \ -stm8s_rst.c \ -stm8s_spi.c \ -stm8s_tim1.c \ -stm8s_tim2.c \ -stm8s_tim4.c \ -stm8s_uart1.c \ -stm8s_wwdg.c -# not used for stm8s103: -#stm8s_adc2.c -#stm8s_can.c \ -#stm8s_tim3.c \ -#stm8s_tim5.c \ -#stm8s_tim6.c \ -#stm8s_uart2.c \ -#stm8s_uart3.c \ -#stm8s_uart4.c - -OBJECTS=$(SOURCES:.c=.o) -OBJECTS_LINK=$(SOURCES:.c=.rel) -EXECUTABLE=stm8s103.lib - -all: $(SOURCES) $(EXECUTABLE) - -$(EXECUTABLE): $(OBJECTS) - $(AR) $(LDFLAGS) $(EXECUTABLE) $(OBJECTS_LINK) - -.c.o: - $(CC) $(CFLAGS) $< -o $@ - -clean: - rm -f *.lib *.rst *.rel *.lst *.ihx *.sym *.asm *.lk *.map - rm -f $(EXECUTABLE) diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/doit b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/doit deleted file mode 100755 index ffa069b0..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/doit +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -# split the library into individual source files for every single function, -# compile them seperately and pack them all together into one big library. - - -LIBSOURCES="stm8s_adc1.c stm8s_awu.c stm8s_beep.c stm8s_clk.c stm8s_exti.c stm8s_flash.c stm8s_gpio.c -stm8s_i2c.c -stm8s_itc.c -stm8s_iwdg.c -stm8s_rst.c -stm8s_spi.c -stm8s_tim1.c -stm8s_tim2.c -stm8s_tim4.c -stm8s_uart1.c -stm8s_wwdg.c" - -# not used for stm8s103: -#stm8s_adc2.c -#stm8s_can.c \ -#stm8s_tim3.c \ -#stm8s_tim5.c \ -#stm8s_tim6.c \ -#stm8s_uart2.c \ -#stm8s_uart3.c \ -#stm8s_uart4.c - - -splitit() { -#awk '/\/\*\*\r/{n++; file="x/$1-" n ".c";print "#include \"inc.h\"">file}{print >file }' $1 -awk "/\/\*\*\r/{n++; file=\"$TMPDIR/$1-\" n \".c\";print \"#include \\\"$1.h\\\"\">file}{print >file }" $1 -cd $TMPDIR -sed "1 d" $1-1.c > $1.h -rm $1-1.c -cd - -} - -TMPDIR=$(mktemp -dp.) -echo "using $TMPDIR" -for i in $LIBSOURCES; do splitit $i; done -cp Makefile $TMPDIR -make -C $TMPDIR -mv $TMPDIR/stm8s103.lib . diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/spl-splitprepare.patch b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/spl-splitprepare.patch deleted file mode 100644 index 8e9fcd92..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/src/spl-splitprepare.patch +++ /dev/null @@ -1,150 +0,0 @@ -Nur in src-split: bak. -Nur in src-split: doit. -Nur in src-split: doit.bak. -diff -ru src/Makefile src-split/Makefile ---- src/Makefile 2016-12-15 20:36:53.146101008 +0100 -+++ src-split/Makefile 2016-12-17 23:21:31.539563260 +0100 -@@ -1,9 +1,10 @@ - CC=sdcc - AR=sdar --CFLAGS=-c -mstm8 -DSTM8S103 -I ../inc --opt-code-size -I. -+CFLAGS=-c -mstm8 -DSTM8S103 -I ../../inc -I../../src --opt-code-size -I. - LDFLAGS=-rc --#SOURCES=$(wildcard stm8*.c) --SOURCES= \ -+SOURCES=$(wildcard stm*.c) -+ -+LIBSOURCES= \ - stm8s_adc1.c \ - stm8s_awu.c \ - stm8s_beep.c \ -Nur in src-split: spl-splitprepare.patch. -diff -ru src/stm8s_adc2.c src-split/stm8s_adc2.c ---- src/stm8s_adc2.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_adc2.c 2016-12-17 23:58:38.065995864 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ****************************************************************************** - * @file stm8s_adc2.c - * @author MCD Application Team -diff -ru src/stm8s_can.c src-split/stm8s_can.c ---- src/stm8s_can.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_can.c 2016-12-18 00:00:53.858390814 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ****************************************************************************** - * @file stm8s_can.c - * @author MCD Application Team -diff -ru src/stm8s_clk.c src-split/stm8s_clk.c ---- src/stm8s_clk.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_clk.c 2016-12-17 23:42:34.875237402 +0100 -@@ -40,7 +40,7 @@ - - /* Private Constants ---------------------------------------------------------*/ - --/** -+/** - * @addtogroup CLK_Private_Constants - * @{ - */ -Nur in src: stm8s_conf.h. -diff -ru src/stm8s_flash.c src-split/stm8s_flash.c ---- src/stm8s_flash.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_flash.c 2016-12-17 23:57:30.841800646 +0100 -@@ -31,7 +31,7 @@ - /** @addtogroup STM8S_StdPeriph_Driver - * @{ - */ --/** -+/*** - @code - This driver provides functions to configure and program the Flash memory of all - STM8S devices. -@@ -88,12 +88,13 @@ - - /* Private Constants ---------------------------------------------------------*/ - --/** @addtogroup FLASH_Private_functions -+/** -+ * @addtogroup FLASH_Private_functions - * @{ - */ - - #if defined (_SDCC_) --/** -+/*** - * @brief write single byte to address - * @note is required for SDCC, which doesn't yet support far pointers. - * For simplicity 16- and 24-bit pointers are treated identically. -@@ -116,7 +117,7 @@ - } - - --/** -+/*** - * @brief Reads any byte from flash memory - * @note is required for SDCC, which doesn't yet support far pointers. - * For simplicity 16- and 24-bit pointers are treated identically. -Nur in src: stm8s_it.h. -Binärdateien src/stm8s.lib und src-split/stm8s.lib sind verschieden. -diff -ru src/stm8s_rst.c src-split/stm8s_rst.c ---- src/stm8s_rst.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_rst.c 2016-12-17 23:43:27.235385164 +0100 -@@ -39,7 +39,7 @@ - /* Private function prototypes -----------------------------------------------*/ - /* Private Constants ---------------------------------------------------------*/ - /* Public functions ----------------------------------------------------------*/ --/** -+/** - * @addtogroup RST_Public_Functions - * @{ - */ -Nur in src: stm8s_tim3.c. -Nur in src: stm8s_tim5.c. -diff -ru src/stm8s_tim6.c src-split/stm8s_tim6.c ---- src/stm8s_tim6.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_tim6.c 2016-12-18 00:00:39.314348474 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ****************************************************************************** - * @file stm8s_tim6.c - * @author MCD Application Team -diff -ru src/stm8s_uart1.c src-split/stm8s_uart1.c ---- src/stm8s_uart1.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_uart1.c 2016-12-17 23:59:31.362150778 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ******************************************************************************** - * @file stm8s_uart1.c - * @author MCD Application Team -diff -ru src/stm8s_uart2.c src-split/stm8s_uart2.c ---- src/stm8s_uart2.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_uart2.c 2016-12-17 23:59:27.090138356 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ******************************************************************************** - * @file stm8s_uart2.c - * @author MCD Application Team -diff -ru src/stm8s_uart3.c src-split/stm8s_uart3.c ---- src/stm8s_uart3.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_uart3.c 2016-12-17 23:59:21.506122120 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ******************************************************************************** - * @file stm8s_uart3.c - * @author MCD Application Team -diff -ru src/stm8s_uart4.c src-split/stm8s_uart4.c ---- src/stm8s_uart4.c 2016-12-15 20:36:53.150101020 +0100 -+++ src-split/stm8s_uart4.c 2016-12-17 23:59:01.358063551 +0100 -@@ -1,4 +1,4 @@ --/** -+/*** - ******************************************************************************** - * @file stm8s_uart4.c - * @author MCD Application Team diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/tools/showdeps.sh b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/tools/showdeps.sh deleted file mode 100755 index cce3b46e..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/tools/showdeps.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - - -if [ $# -ne 1 ]; then - cat << EOF -split the library into individual source files for every single function, -compile them seperately and pack them all together into one big library. - -usage: $0 cputype - -supported cpu types as found in inc/stm8s.h: -EOF - grep defined inc/stm8s.h|fmt -1|sed -n 's,.*(STM8,\tSTM8,p'|sed 's,).*,,'|sort|uniq - cat << EOF - -These cpus are known to use identical libraries: - Low density devices: STM8S003, STM8S103 - Medium density devices: STM8S005, STM8S105, STM8AF626x - High density devices without CAN: STM8S007, STM8S207, STM8AF62Ax - High density devices with CAN: STM8S208, STM8AF52Ax - App. specific low density devices:STM8S903 - STM8AF622x -EOF - exit 1 -fi - -CPU=$1 - -HFILES=$(sdcc -mstm8 -Iinc -Isrc -D$CPU "-Wp-MM" -E inc/stm8s.h|fmt -1|sed -n 's, *inc/stm8s_,stm8s_,p') -CFILES=${HFILES//.h/.c} - -echo "Needed source code modules for CPU $CPU:" -echo $CFILES diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/use_stdint_h.patch b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/use_stdint_h.patch deleted file mode 100644 index 1f6fb6da..00000000 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/use_stdint_h.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/STM8S_StdPeriph_Driver/inc/stm8s.h b/STM8S_StdPeriph_Driver/inc/stm8s.h -index 8579639..cc5750e 100644 ---- a/STM8S_StdPeriph_Driver/inc/stm8s.h -+++ b/STM8S_StdPeriph_Driver/inc/stm8s.h -@@ -216,6 +216,9 @@ - #define __O volatile /*!< defines 'write only' permissions */ - #define __IO volatile /*!< defines 'read / write' permissions */ - -+#ifdef USE_STDINT -+#include -+#else - /*!< Signed integer types */ - typedef signed char int8_t; - typedef signed short int16_t; -@@ -225,6 +228,7 @@ typedef signed long int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned long uint32_t; -+#endif - - /*!< STM8 Standard Peripheral Library old types (maintained for legacy purpose) */ - From 8e22787a653fba1da88c6036672f9b73ee880e7a Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Fri, 11 Jan 2019 18:05:28 +0100 Subject: [PATCH 38/59] update SPL to v2.3.0 --- CHANGELOG.md | 1 + .../STM8S_StdPeriph_Driver/Release_Notes.html | 5 +- .../stm8/STM8S_StdPeriph_Driver/inc/stm8s.h | 185 ++++++++++-------- .../STM8S_StdPeriph_Driver/inc/stm8s_adc1.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_adc2.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_awu.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_beep.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_can.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_clk.h | 4 +- .../{src => inc}/stm8s_conf.h | 60 +++--- .../STM8S_StdPeriph_Driver/inc/stm8s_exti.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_flash.h | 10 +- .../STM8S_StdPeriph_Driver/inc/stm8s_gpio.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_i2c.h | 6 +- .../{src => inc}/stm8s_it.h | 121 ++++++++++-- .../STM8S_StdPeriph_Driver/inc/stm8s_itc.h | 14 +- .../STM8S_StdPeriph_Driver/inc/stm8s_iwdg.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_rst.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_spi.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim1.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim2.h | 9 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim3.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim4.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim5.h | 9 +- .../STM8S_StdPeriph_Driver/inc/stm8s_tim6.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_uart1.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_uart2.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_uart3.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_uart4.h | 4 +- .../STM8S_StdPeriph_Driver/inc/stm8s_wwdg.h | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_adc1.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_adc2.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_awu.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_beep.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_can.c | 33 ++-- .../STM8S_StdPeriph_Driver/src/stm8s_clk.c | 8 +- .../STM8S_StdPeriph_Driver/src/stm8s_exti.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_flash.c | 164 ++++++++-------- .../STM8S_StdPeriph_Driver/src/stm8s_gpio.c | 8 +- .../STM8S_StdPeriph_Driver/src/stm8s_i2c.c | 24 +-- .../STM8S_StdPeriph_Driver/src/stm8s_itc.c | 28 +-- .../STM8S_StdPeriph_Driver/src/stm8s_iwdg.c | 9 +- .../STM8S_StdPeriph_Driver/src/stm8s_rst.c | 8 +- .../STM8S_StdPeriph_Driver/src/stm8s_spi.c | 6 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim1.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim2.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim3.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim4.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim5.c | 4 +- .../STM8S_StdPeriph_Driver/src/stm8s_tim6.c | 11 +- .../STM8S_StdPeriph_Driver/src/stm8s_uart1.c | 6 +- .../STM8S_StdPeriph_Driver/src/stm8s_uart2.c | 6 +- .../STM8S_StdPeriph_Driver/src/stm8s_uart3.c | 6 +- .../STM8S_StdPeriph_Driver/src/stm8s_uart4.c | 6 +- .../STM8S_StdPeriph_Driver/src/stm8s_wwdg.c | 4 +- .../stm8s-a_stdperiph_drivers_um.chm | Bin 3893765 -> 0 bytes 56 files changed, 480 insertions(+), 387 deletions(-) rename sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/{src => inc}/stm8s_conf.h (56%) rename sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/{src => inc}/stm8s_it.h (50%) delete mode 100644 sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/stm8s-a_stdperiph_drivers_um.chm diff --git a/CHANGELOG.md b/CHANGELOG.md index bd051277..185aa091 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - reduced binary size by optimizing the pinMode() implementation - using busybox as command shell for windows to run the wrapper scripts - move the SPL compilation scripts into a separate project spl-splitter +- update SPL files to v2.3.0 (add support for STM8S001) ### Fixed - building the core library when using make (regression bug in 0.4.0) diff --git a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/Release_Notes.html b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/Release_Notes.html index c753ca3b..0924d529 100644 --- a/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/Release_Notes.html +++ b/sduino/hardware/sduino/stm8/STM8S_StdPeriph_Driver/Release_Notes.html @@ -290,7 +290,10 @@

STM8S/A Standard Peripherals Library Drivers update history

 

-

V2.2.0 / 30-September-2014

Main +

V2.3.0 / 16-June-2017

Main +Changes

+
  • Peripheral drivers updated to support the STM8S001J3 8K (STM8S001) +product family devices
  • stm8s.h 
    • Add new definition of STM8S001  product family devices
    • Add new define UNUSED to fix compilation warning with RAISONANCE
  • stm8s_flash.c 
    • Update FLASH_WaitForLastOperation() to use UNUSED  macro to fix compilation warning with RAISONANCE

V2.2.0 / 30-September-2014

Main Changes