Common Programs¶
Describes programs supplied with every Mecrisp-Stellaris Release. These are located in “mecrisp-stellaris-X.X.X/common”.
This page is a work in progress ….
All the programs below are loaded the usual way via a serial terminal
assembler-m0.txt¶
bitlog.txt¶
blocks.txt¶
calltrace.txt¶
charcomma.txt¶
conditional.txt¶
disassembler-m0.txt¶
Disassembles Cortex M0 Words into Assembly Language. Useful for optimising your Words etc.
Calling Word(s)¶
see
: three-plus 3 + ; ok.
3 three-plus . 6 ok.
see three-plus
20000342: B500 push { lr }
20000344: 3603 adds r6 #3
20000346: BD00 pop { pc }
ok.
disassembler-m3.txt¶
Same as disassembler-m0.txt but for the Cortex M3
dump.txt¶
Reads (dumps) bytes or regions of memory.
Calling Word(s)¶
dump16 ( address – dump 16 bytes of memory )
dump ( address range – dump memory )
0 dump16
00000000 : 30 03 00 20 49 37 00 00 D9 35 00 00 D9 35 00 00 | 0.. I7.. .5...5.. |
0 $30 dump
00000000 : 30 03 00 20 49 37 00 00 D9 35 00 00 D9 35 00 00 | 0.. I7.. .5...5.. |
00000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ........ ........ |
00000020 : 00 00 00 00 00 00 00 00 00 00 00 00 03 36 00 00 | ........ .....6.. |
00000030 : 00 00 00 00 00 00 00 00 03 36 00 00 B7 35 00 00 | ........ .6...5.. |
$30 $50 dump
00000030 : 00 00 00 00 00 00 00 00 03 36 00 00 B7 35 00 00 | ........ .6...5.. |
00000040 : 03 36 00 00 03 36 00 00 03 36 00 00 03 36 00 00 | .6...6.. .6...6.. |
00000050 : 03 36 00 00 27 36 00 00 4B 36 00 00 71 36 00 00 | .6..'6.. K6..q6.. |
00000060 : 03 36 00 00 03 36 00 00 03 36 00 00 03 36 00 00 | .6...6.. .6...6.. |
00000070 : 93 36 00 00 B7 36 00 00 DB 36 00 00 FD 36 00 00 | .6...6.. .6...6.. |
00000080 : 21 37 00 00 03 36 00 00 03 36 00 00 03 36 00 00 | !7...6.. .6...6.. |
editor.txt¶
examples.txt¶
experimental/¶
floored-divide.txt¶
fonts/¶
Flash¶
Error Message¶
Wrong address or data for writing flash !
Originates from ?¶
flash.s in your MCU source directory
Causes¶
Are you trying to write into the area reserved for the dictionary because that is not allowed and will print that error. The Forth core address range is set here
Is the address even ? it must be divisible by 2.
Does the data at the Flash memory address contain all $FFFFFFFF which is the erased state. If a location has already been written to then the flash controller will raise this error. To write new data into a previously written flash location, the whole sector must be erased first.
Note
Flash sector(s) at the end of the flash area can be set aside from the reserved Mecrisp-Stellaris dictionary area with some core mods. This will provide a scratch pad area you can write to outside of Mecrisp-Stellaris at the expense of reduced dictionary space. For instance the F407 has 128KB available at sector 11, or the F103 (bluepill) has 2K in its last sector.
graphics-unicode-8x16.txt¶
graphics-unicode-8x8.txt¶
graphics.txt¶
longcomment.txt¶
mecrisp-registergenerator/¶
multitask.txt¶
nvic.txt¶
profiler.txt¶
prompt.txt¶
pseudorandom.txt¶
quotations.txt¶
registergenerator/¶
romans.txt¶
sine.txt¶
sqrt.txt¶
svd2forth-v2/¶
Exceptions¶
Note
This EXCEPTION article was written using a ST32F103C8 MCU (Cortex-M3) for the examples and testing.
An EXCEPTION is defined in the ARM specification as “a condition that changes the normal flow of control in a program”
An EXCEPTION is similar to a INTERRUPT.
Cortex-M has many EXCEPTIONS and they generally occur when something bad happened, such as reading a memory location that doesn’t exist.
The registers that deal with EXCEPTIONS reside in the ARM “Core Peripherals” System control block (SCB) peripheral and common across all Cortex-M models.
SCB_ICSR @ $E000ED04 the “Interrupt control and state register” is relevant here.
For STM32F103 see ST Micro Document PM0056, page 129/156
Debugging¶
The Word “Calltrace.txt” attempts to list the cause of the EXCEPTION and also prevents the dreaded “Unhandled Interrupt 00000003 !” message printing endlessly until the MCU is reset.
Requires¶
mecrisp-stellaris-x.x.x/common/calltrace.txt from your Mecrisp-Stellaris release tarball.
Warning
calltrace.txt searches for the closest dictionary entry points to the addresses on the return stack and may give random results for values that aren’t return addresses. It is assumed that the programmer can decide from context which ones are correct.
Implementation¶
The “irq-fault” INTERRUPT must be configured to call the Word “ct-irq” in your program. When a EXCEPTION occurs, this attempts to show the cause.
' ct-irq irq-fault !
Example; Terminal Entry¶
This EXCEPTION was contrived by attempting to read non-existent memory at the Terminal. This is a very common occurrence during development.
$100000 @ .
Result¶
Unhandled Interrupt 00000003 !
[1 ] 0000006E 00100000
Calltrace:
00000000 0000C0DD calltrace-handler
00000001 FFFFFFF9
00000002 00001824 @
00000003 00000220 --- MS RA 2.5.1 tpmod ---
00000004 00001824 @
00000005 00000020
00000006 FEFBAFF7
00000007 00004683 interpret
00000008 00001824 @
00000009 01000000 init.calltrace
0000000A 0000BF2D redstack.prompt
0000000B 000046DD quit
Note
The MCU is HALTED at this point and will require a RESET as most EXCEPTIONS are not recoverable.
Description¶
The “HardFault” EXCEPTION #3 was raised
The stack contents are dumped, note the “00100000” which I had entered before the EXCEPTION was raised.
Calltrace was run (from the previously loaded “calltrace.txt”)
Some additional irrelevant information was also printed as per the warning above.
Customisation¶
A printout of the SCB_ICSR (at $E000ED04) register has been added to calltrace.txt for additional information.
1000000 @ .
Unhandled Interrupt 00000003 !
[1 ] 0000006E 000F4240
Calltrace:
SCB_ICSR:$0400F803
3322222222221111111111
10987654321098765432109876543210
00000100000000001111100000000011
00000000 0000A73D calltrace-handler
00000001 FFFFFFF9
00000002 00001824 @
00000003 00000220 --- MS RA 2.5.1 tpmod ---
00000004 00001824 @
00000005 00000020
00000006 FEFBAFF7
00000007 00004683 interpret
00000008 00001824 @
00000009 01000000 init.calltrace
0000000A 0000A56D redstack.prompt
0000000B 000046DD quit
Example; Program Execution¶
In this example the Word “cause-exception” is executed.
: cause-exception ( -- )
1000000 @ .
;
Code¶
getid
cause-exception
getid-STM32F103CB-data
getid-GD32F103-data
xml
Result¶
Unhandled Interrupt 00000003 !
[0 ] 00000000
Calltrace:
SCB_ICSR:$0400F803
3322222222221111111111
10987654321098765432109876543210
00000100000000001111100000000011
00000000 0000A73B calltrace-handler
00000001 FFFFFFF9
00000002 000F4200 init.calltrace
00000003 00000000
00000004 20000DDE cause-exception
00000005 00000000
00000006 FEFBAFF7
00000007 00004683 interpret
00000008 20000DE6 cause-exception
00000009 01000000 init.calltrace
0000000A 0000A56D redstack.prompt
0000000B 000046DD quit
Description¶
The “HardFault” EXCEPTION #3 was raised
The stack contents are dumped, note the listing of the cause “cause-exception” after “calltrace-handler” is triggered making the reason for the EXCEPTION easy to find.
Calltrace was run (from the previously loaded “calltrace.txt”)
Some additional irrelevant information was also printed as per the warning above.
See also