Hello Where can I find some example programs only in asm to be compiled inder Keil MDK? I can't compile simple programs as:
STACK_TOP EQU 0x20002000 ; constant for SP starting value AREA |Header Code|, CODE DCD STACK_TOP ; Stack top DCD Start ; Reset vector ENTRY ; Indicate program execution start here Start ; Start of main program ; initialize registers MOV r0, #10 ; Starting loop counter value MOV r1, #0 ; starting result ; Calculated 10+9+8+...+1 loop ADD r1, r0 ; R1R1 + R0 SUBS r0, #1 ; Decrement R0, update fl ag (“S†sufï¬ x) BNE loop ; If result not zero jump to loop ; Result is now in R1 deadloop B deadloop ; Inï¬ nite loop END ; End of ï¬ le
Keil gives an error: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
How to change this program? How to change linker control string?
I tried also to add startup code fo nxp1766 but then i still have an error that label __main is missing.
Could You help me and give me some simple programs just to compile it properly?
Why not study, experiment and learn to understand what's happening with the startup code. Leave the 'main' in C to begin with and remove it when you understand how to.
I compiled above program from command line and it is working. In Keil i can't compile it. It still needs Reset_Handler label even if I changed Start to Reset_Handler.
1 - Find an example program from Keil for your processor. 2 - Change the 'main' function to a do nothing. 3 - Compile the project. 4 - Now examine, understand and learn from the startup.
Simple.
There is no pure assembler project in Keil MDK.
Another problem. I don't know why the board executes only specified number of instructions. Here is the example:
STACK_TOP EQU 0x10000200 ; constant for SP starting value AREA |Header Code|, CODE DCD STACK_TOP ; Stack top DCD Start ; Reset vector ENTRY ; Indicate program execution start here Start ; Start of main program MOV R1, #10 MOVW R3, #0xC040 ;P2.2, P2.3, P2.4, P2.5, and P2.6 function mode is located at FP2DIR (0×2009_C040). MOVT R3, #0x2009 MOVW R2, #0x007C ;P2.2 -> Bit[2] * P2.3 -> Bit[3]* P2.4 -> Bit[4]* P2.5 -> Bit[5]* P2.6 -> Bit[6] -> Output dir : 1 STR R2, [R3] loop B loop END
This program executes correctly. It defines the GPIO ports as output. On board leds are off (after reset state normally all leds are on). Then I modified the program by adding the same line
STACK_TOP EQU 0x10000200 ; constant for SP starting value AREA |Header Code|, CODE DCD STACK_TOP ; Stack top DCD Start ; Reset vector ENTRY ; Indicate program execution start here Start ; Start of main program MOV R1, #10 MOV R1, #10 MOVW R3, #0xC040 ;P2.2, P2.3, P2.4, P2.5, and P2.6 function mode is located at FP2DIR (0×2009_C040). MOVT R3, #0x2009 MOVW R2, #0x007C ;P2.2 -> Bit[2] * P2.3 -> Bit[3]* P2.4 -> Bit[4]* P2.5 -> Bit[5]* P2.6 -> Bit[6] -> Output dir : 1 STR R2, [R3] loop B loop END
So normally the program does the same but now leds are still on so the instruction STR R2, [R3] is not executing. Where is the problem? I'm using keil compilers as follows:
"C:\Program Files\keil\ARM\BIN40\armasm" --device darmp1 -o .\blinky.o .\blinky.s "C:\Program Files\keil\ARM\BIN40\armlink" --device darmp1 --rw_base 0x10000000 --ro_base 0x0 --map -o .\blinky.elf .\blinky.o "C:\Program Files\keil\ARM\BIN40\fromelf" --bin --output .\blinky.bin .\blinky.elf "C:\Program Files\keil\ARM\BIN40\fromelf" --i32 --output .\blinky.hex .\blinky.elf
"There is no pure assembler project in Keil MDK."
Who suggested there was?
The startup code is in assembler - So there would be the starting point.
Time to add a data-abort handler and reading about data alignments - R3 contains an unaligned address so
STR R2,[R3]
must generate an access fault...
this is not true for all ARM processors. in fact, STR is documented to have the ability to handle unaligned accesses on ARM7 and Cortex M3 !
STR R2, [R3, #0] doesn't work also. Fro me the problem is not the instruction but one additional line in the code. I copied the code from: embeddedfreak.wordpress.com/.../ It is the same board.
Finally I wrote a program which can be compiled in Keil:
; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Stack_Size EQU 0x00000200 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> Heap_Size EQU 0x00000000 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler AREA Program, CODE, READONLY EXPORT Reset_Handler ;Defines the program starting point ;Program start Reset_Handler MOV R1, #0 MOVW R3, #0xC040 ;P2.2, P2.3, P2.4, P2.5, and P2.6 function mode is located at FP2DIR (0×2009_C040). MOVT R3, #0x2009 MOVW R2, #0x007C ;P2.2 -> Bit[2] * P2.3 -> Bit[3]* P2.4 -> Bit[4]* P2.5 -> Bit[5]* P2.6 -> Bit[6] -> Output dir : 1 MOVT R2, #0x0000 ;/* b0000_0000_0000_0000_0000_0000_0111_1100 */ STR R2, [R3, #0] loop B loop END
The first part was copied from build-in startup file. But it didn't fix the problem....
Gp F wrote: > R3 contains an unaligned address
Really? The value in r3 is 0x2009C040. Looks aligned to me.
MOVW assigns the lower half-word and clears the upper. MOVT assigns the upper half-word. Easier to use here would be the pseudo instruction
MOV32 r3, #0x2009C040
Tamir wrote: > in fact, STR is documented to have the ability to handle unaligned > accesses on ARM7 and Cortex M3 !
Depends on what is meant by "handle". ARM7 has a rather creative way of dealing with unaligned accesses -- the results would be unexpected to most people who are unfamiliar with architecture details.
Cortex-M3 does handle unaligned accesses but not in all situations. Check out the documentation.
-- Marcus http://www.doulos.com/arm/
I found the sollution. Probabely the program code was in reserver region. I copied all startup code (all vector table) and now it is working properly. I found it in dissasembled code. In all built in projects the first instruction was in higher address than 0x18 in my code. Now I use build in startup file but I have to comment one line:
User Initial Stack & Heap IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE ; IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF
because i get following messages: blinky.axf: Warning: L6665W: Neither Lib$$Request$$armlib Lib$$Request$$cpplib defined, not searching ARM libraries. blinky.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from startup_lpc17xx.o).