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_asm01 buffer_init_asm02
Buffer vor der Initialisierung Buffer 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. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.