MSP430 Buffer erstellen und initialisieren

In diesem Beispiel-Programm soll ein Buffer mit einer definierten Größe erstellt werden und komplett initialisiert werden (mit einem bestimmten Wert). Weiterhin wird das Initialisierungs-Unterprogramm in einer eigenen Datei ausgelagert.

ASM-Programm

FILE: main.asm

;***********************************************
;     ___       _             _     
;    |   |_ _ _| |___ ___   _| |___
;    | | |_'_| . | -_|  _|_| . | -_|
;    |___|_,_|___|___|___|_|___|___|
;
; FILE:     main.asm
; Author:   declis (xdec.de)
;***********************************************

    .cdecls "msp430g2231.h"
    .cdecls "lib_func_asm.h"
    .bss buffer,size               ;allocate 16 bytes in RAM
    .ref buf_init
    .global main
    .text

main:
    mov.w #0x280,SP                ;initialize stack pointer
    mov.w #WDTPW+WDTHOLD,&WDTCTL   ;stop watchdog timer

    mov.w #buffer,R4               ;startaddress of buffer in R4

    call #buf_init

    jmp $

    .end

FILE: lib_func.asm

;***********************************************
;     ___       _             _     
;    |   |_ _ _| |___ ___   _| |___
;    | | |_'_| . | -_|  _|_| . | -_|
;    |___|_,_|___|___|___|_|___|___|
;
; FILE:     lib_func.asm
; Author:   declis (xdec.de)
;***********************************************

    .cdecls "msp430g2231.h"
    .cdecls "lib_func_asm.h"
    .def buf_init              ;global entry of function
    .text

;------------------------------------------
; Name:         buf_init
; Description:  initialize memory/buffer
; Input:        R4 - sourcepointer of buffer
; Returns:      nothing
; Destroys:     nothing
;------------------------------------------
buf_init:
    push.w SR          ;save status register
    push.w R4          ;save other registers
    push.w R5

    mov.w #size,R5
    cmp.w #0,R5        ;index=0?
loop:
    jz done            ;index=0, return
    mov.b #value,0(R4) ;copy value into buffer -> buffer[index]=value;
    inc.w R4           ;sourcepointer+1
    dec.w R5           ;index-1
    jmp loop
done:
    pop.w R5
    pop.w R4
    pop.w SR
    ret

    .end

FILE: lib_func_asm.h

;***********************************************
;     ___       _             _     
;    |   |_ _ _| |___ ___   _| |___
;    | | |_'_| . | -_|  _|_| . | -_|
;    |___|_,_|___|___|___|_|___|___|
;
; FILE:     lib_func_asm.h
; Author:   declis (xdec.de)
;***********************************************

#ifndef LIB_FUNC_ASM_H_
#define LIB_FUNC_ASM_H_

#define size 16         /* define size=16 */
#define value 0         /* initialize buffer with "value" */

#endif /*LIB_FUNC_ASM_H_*/
buffer_init_asm01buffer_init_asm02
Buffer vor der InitialisierungBuffer nach der Initialisierung (mit Null)

C-Programm

Und nochmal das gleiche Programm in C übersetzt:

FILE: main.c

  1. /*************************************************
  2.  *     ___       _             _    
  3.  *    |   |_ _ _| |___ ___   _| |___
  4.  *    | | |_'_| . | -_|  _|_| . | -_|
  5.  *    |___|_,_|___|___|___|_|___|___|
  6.  *
  7.  * FILE:     main.c
  8.  * Author:   declis (xdec.de)
  9.  ************************************************/
  10.  
  11. #include <msp430g2231.h>
  12. #include "lib_func.h"
  13.  
  14. void main(void)
  15. {
  16.     char buffer[size];
  17.  
  18.     WDTCTL=WDTPW+WDTHOLD;           /* stop watchdog timer */
  19.  
  20.     buf_init(buffer);
  21.  
  22.     for(;;);
  23. }
/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * FILE:     main.c
 * Author:   declis (xdec.de)
 ************************************************/

#include <msp430g2231.h>
#include "lib_func.h"

void main(void)
{
    char buffer[size];

    WDTCTL=WDTPW+WDTHOLD;           /* stop watchdog timer */

    buf_init(buffer);

    for(;;);
}

FILE: lib_func.c

  1. /*************************************************
  2.  *     ___       _             _    
  3.  *    |   |_ _ _| |___ ___   _| |___
  4.  *    | | |_'_| . | -_|  _|_| . | -_|
  5.  *    |___|_,_|___|___|___|_|___|___|
  6.  *
  7.  * FILE:     lib_func.c
  8.  * Author:   declis (xdec.de)
  9.  ************************************************/
  10.  
  11. #include <msp430g2231.h>
  12. #include "lib_func.h"
  13.  
  14. void buf_init(char *buffer)
  15. {
  16.     char index=0;
  17.  
  18.     while(index<size)
  19.         buffer[index++]=value;
  20.  
  21. }
/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * FILE:     lib_func.c
 * Author:   declis (xdec.de)
 ************************************************/

#include <msp430g2231.h>
#include "lib_func.h"

void buf_init(char *buffer)
{
    char index=0;

    while(index<size)
        buffer[index++]=value;

}

FILE: lib_func.h

  1. /*************************************************
  2.  *     ___       _             _    
  3.  *    |   |_ _ _| |___ ___   _| |___
  4.  *    | | |_'_| . | -_|  _|_| . | -_|
  5.  *    |___|_,_|___|___|___|_|___|___|
  6.  *
  7.  * FILE:     lib_func.h
  8.  * Author:   declis (xdec.de)
  9.  ************************************************/
  10.  
  11. #ifndef LIB_FUNC_H_
  12. #define LIB_FUNC_H_
  13.  
  14. #define size_def 16
  15. #define value_def 2
  16.  
  17. void buf_init(char*);
  18.  
  19. #endif /*LIB_FUNC_H_*/
/*************************************************
 *     ___       _             _     
 *    |   |_ _ _| |___ ___   _| |___
 *    | | |_'_| . | -_|  _|_| . | -_|
 *    |___|_,_|___|___|___|_|___|___|
 *
 * FILE:     lib_func.h
 * Author:   declis (xdec.de)
 ************************************************/

#ifndef LIB_FUNC_H_
#define LIB_FUNC_H_

#define size_def 16
#define value_def 2

void buf_init(char*);

#endif /*LIB_FUNC_H_*/
buffer_init_c01
Buffer mit “2” gefüllt, interessant zu sehen: Das C-Programm ist ein paar Bytes kleiner als das ASM-Programm.

Leave a Reply

Your email address will not be published.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

This site uses Akismet to reduce spam. Learn how your comment data is processed.