logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[LPC2148] LPC2148: Błędy alokacji pamięci przy sprintf(), strtok(), printf() w C

valarian 04 Sie 2009 10:27 2724 12
REKLAMA
  • #1 6855042
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    Hej,

    Mam problem z LPC2148. Otóż nie działa mi część funkcji, związana w jakiś sposób z alokacją pamięci, np.:
    sprintf() z liczbami float- procek od razu "wiesza się", nie wykonuje już żadnej instrukcji za sprintf() (same operacje na liczbach float działają OK); sprintf() z liczbami int działa w porządku
    strtok() od razu przy pierwszym wywołaniu zatrzymuje mikrokontroler
    printf() również zatrzymuje mikroklocka

    Nie działa np.:
    int *a=(int*)malloc(4*sizeof(int));

    ale działa za to:
    int *a=(int*)malloc(3*sizeof(int));


    Męczę się z tym już 3 dzień, przerobiłem kilka razy syscalls.c, kilka startupów i dalej nic. Aktualnie syscalls.c mam ten:
    http://yagarto.de/download/yagarto/syscalls.c

    startup.c i lpc2148-rom.ld (lekko zmodyfikowane) z przykładów Freddiego C.

    Pozdrawiam i z góry dziękuję za pomoc,

    Val
  • REKLAMA
  • REKLAMA
  • #3 6855240
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    OK, więc tak:
    startup.s
    /*
    +=============================================================================+
    | includes
    +=============================================================================+
    */
    
    #include "hdr/hdr_cpsr.h"
    
    /*
    +=============================================================================+
    | startup code
    +=============================================================================+
    */
    
    .text
    .balign 2
    .syntax unified
    .arm
    .func   Reset_Handler
    .global Reset_Handler
    
    Reset_Handler:
    
    /*
    +-----------------------------------------------------------------------------+
    | stack setup
    +-----------------------------------------------------------------------------+
    */
    
    	// after reset the core is in Supervisor mode with IRQ & FIQ disabled
    	ldr   sp,=_supervisor_stack_end;			// set the stack for Supervisor mode
    	msr   CPSR_c,#FIQ_MODE|CPSR_I|CPSR_F		// switch to FIQ mode, IRQ & FIQ disabled
    	ldr   sp,=_fiq_stack_end;					// set the stack for FIQ mode
    	msr   CPSR_c,#IRQ_MODE|CPSR_I|CPSR_F 		// switch to IRQ mode, IRQ & FIQ disabled
    	ldr   sp,=_irq_stack_end;					// set the stack for IRQ mode
    	msr   CPSR_c,#ABORT_MODE|CPSR_I|CPSR_F		// switch to Abort mode, IRQ & FIQ disabled
    	ldr   sp,=_abort_stack_end;					// set the stack for Abort mode
    	msr   CPSR_c,#UNDEFINED_MODE|CPSR_I|CPSR_F	// switch to Undefined mode, IRQ & FIQ disabled
    	ldr   sp,=_undefined_stack_end;				// set the stack for Undefined mode
    	msr   CPSR_c,#SYSTEM_MODE|CPSR_I|CPSR_F 	// switch to System mode, IRQ & FIQ disabled
    	ldr   sp,=_system_stack_end;				// set the stack for System mode
    	msr   CPSR_c,#USER_MODE 					// switch to User mode, IRQ & FIQ enabled
    	ldr   sp,=_user_stack_end;					// set the stack for User mode
    
    /*
    +-----------------------------------------------------------------------------+
    | initialize .data section
    +-----------------------------------------------------------------------------+
    */
    
    	ldr     R1,=_text_end
    	ldr     R2,=_data_start
    	ldr     R3,=_data_end
    1:	cmp     R2,R3
    	ldrlo   R0,[R1],#4
    	strlo   R0,[R2],#4
    	blo     1b
    
    /*
    +-----------------------------------------------------------------------------+
    | zero-init .bss section
    +-----------------------------------------------------------------------------+
    */
    
    	mov     R0,#0
    	ldr     R1,=_bss_start
    	ldr     R2,=_bss_end
    1:	cmp     R1,R2
    	strlo   R0,[R1],#4
    	blo     1b
    
    /*
    +-----------------------------------------------------------------------------+
    | Branch to main() with link
    +-----------------------------------------------------------------------------+
    */
    
    	ldr		R0,=main
    	mov		LR,PC
    	bx		R0
    
    /*
    +-----------------------------------------------------------------------------+
    | on return from main - loop till the end of the world
    +-----------------------------------------------------------------------------+
    */
    
    	b		.
    
    .endfunc
    
    /******************************************************************************
    * END OF FILE
    ******************************************************************************/
    
    


    lpc2148_rom.ld
    SEARCH_DIR(.);
    
    /*
    +=============================================================================+
    | format configurations
    +=============================================================================+
    */
    
    OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm");
    OUTPUT_ARCH(arm);
    
    /*
    +=============================================================================+
    | stacks sizes
    +=============================================================================+
    */
    
    _system_stack_size = 0x00000040;
    _user_stack_size = 0x00001400;
    _fiq_stack_size = 0x00000040;
    _irq_stack_size = 0x00000040;
    _supervisor_stack_size = 0x00000400;
    _abort_stack_size = 0x00000040;
    _undefined_stack_size = 0x00000040;
    
    PROVIDE(_user_stack_size = _user_stack_size);
    PROVIDE(_fiq_stack_size = _fiq_stack_size);
    PROVIDE(_irq_stack_size = _irq_stack_size);
    PROVIDE(_supervisor_stack_size = _supervisor_stack_size);
    PROVIDE(_abort_stack_size = _abort_stack_size);
    PROVIDE(_undefined_stack_size = _undefined_stack_size);
    PROVIDE(_system_stack_size = _system_stack_size);
    
    
    
    /*
    +=============================================================================+
    | available memories definitions
    +=============================================================================+
    */
    
    MEMORY
    {
    	rom (rx)	: org = 0x00000000, len = 512k
    	ram (rwx)	: org = 0x40000000, len = 32k
    }
    
    _rom_start = ORIGIN(rom);
    _rom_size = LENGTH(rom);
    _rom_end = _rom_start + _rom_size;
    
    _ram_start = 0x40000000; 
    _ram_size = 0x00007FFF; /* leave room for IAP */ 
    _ram_end = _ram_start + _ram_size;
    
    PROVIDE(_rom_start = _rom_start);
    PROVIDE(_rom_size = _rom_size);
    PROVIDE(_rom_end = _rom_end);
    
    PROVIDE(_ram_start = _ram_start);
    PROVIDE(_ram_size = _ram_size);
    PROVIDE(_ram_end = _ram_end);
    
    /*
    +=============================================================================+
    | entry point
    +=============================================================================+
    */
    
    ENTRY(Reset_Handler);
    
    /*
    +=============================================================================+
    | put data in sections
    +=============================================================================+
    */
    
    SECTIONS
    {
    	.text :
    	{
    		_text_start = .;
    		PROVIDE(_text_start = _text_start);
    		KEEP(*(.vectors));
    		*(.text);
    		*(.text.*);
    		*(.rodata);
    		*(.rodata.*);
    		*(.glue_7t);
    		*(.glue_7);
    		. = ALIGN(4);
    		_text_end = .;
    		PROVIDE(_text_end = _text_end);
    	} > rom AT > rom
    	
    	.data :
    	{
    		_data_start = .;
    		PROVIDE(_data_start = _data_start);
    		*(.data);
    		. = ALIGN(4);
    		*(.data.*);
    		. = ALIGN(4);
    		_data_end = .;
    		PROVIDE(_data_end = _data_end);
    	} > ram AT > rom
    	
    	.bss :
    	{
    		_bss_start = .;
    		PROVIDE(_bss_start = _bss_start);
    		*(.bss)
    		. = ALIGN(4);
    		*(.bss.*)
    		. = ALIGN(4);
    		*(COMMON)
    		. = ALIGN(4);
    		_bss_end = .;
    		PROVIDE(_bss_end = _bss_end);
    	} > ram AT > ram
    	
    	.stack :
    	{		
    		_stack_start = .;
    		PROVIDE(_stack_start = _stack_start);
    		
    		_user_stack_start = .;
    		PROVIDE(_user_stack_start = _user_stack_start);
    		. += _user_stack_size;
    		. = ALIGN(4);		
    		_user_stack_end = .;
    		PROVIDE(_user_stack_end = _user_stack_end);
    		
    		_fiq_stack_start = .;
    		PROVIDE(_fiq_stack_start = _fiq_stack_start);
    		. += _fiq_stack_size;
    		. = ALIGN(4);		
    		_fiq_stack_end = .;
    		PROVIDE(_fiq_stack_end = _fiq_stack_end);
    		
    		_irq_stack_start = .;
    		PROVIDE(_irq_stack_start = _irq_stack_start);
    		. += _irq_stack_size;
    		. = ALIGN(4);		
    		_irq_stack_end = .;
    		PROVIDE(_irq_stack_end = _irq_stack_end);
    		
    		_supervisor_stack_start = .;
    		PROVIDE(_supervisor_stack_start = _supervisor_stack_start);
    		. += _supervisor_stack_size;
    		. = ALIGN(4);		
    		_supervisor_stack_end = .;
    		PROVIDE(_supervisor_stack_end = _supervisor_stack_end);
    		
    		_abort_stack_start = .;
    		PROVIDE(_abort_stack_start = _abort_stack_start);
    		. += _abort_stack_size;
    		. = ALIGN(4);		
    		_abort_stack_end = .;
    		PROVIDE(_abort_stack_end = _abort_stack_end);
    		
    		_undefined_stack_start = .;
    		PROVIDE(_undefined_stack_start = _undefined_stack_start);
    		. += _undefined_stack_size;
    		. = ALIGN(4);		
    		_undefined_stack_end = .;
    		PROVIDE(_undefined_stack_end = _undefined_stack_end);
    		
    		_system_stack_start = .;
    		PROVIDE(_system_stack_start = _system_stack_start);
    		. += _system_stack_size;
    		. = ALIGN(4);		
    		_system_stack_end = .;
    		PROVIDE(_system_stack_end = _system_stack_end);
    		
    		_stack_end = .;
    		PROVIDE(_stack_end = _stack_end);
    	} > ram AT > ram
    	
    	_end = .;
    	PROVIDE(_end = _end);
    	
    	.stab 				0 (NOLOAD) : { *(.stab) }
    	.stabstr 			0 (NOLOAD) : { *(.stabstr) }
    	/* DWARF debug sections.
    	* Symbols in the DWARF debugging sections are relative to the beginning
    	* of the section so we begin them at 0.  */
    	/* DWARF 1 */
    	.debug				0 : { *(.debug) }
    	.line				0 : { *(.line) }
    	/* GNU DWARF 1 extensions */
    	.debug_srcinfo		0 : { *(.debug_srcinfo) }
    	.debug_sfnames		0 : { *(.debug_sfnames) }
    	/* DWARF 1.1 and DWARF 2 */
    	.debug_aranges		0 : { *(.debug_aranges) }
    	.debug_pubnames		0 : { *(.debug_pubnames) }
    	/* DWARF 2 */
    	.debug_info			0 : { *(.debug_info .gnu.linkonce.wi.*) }
    	.debug_abbrev		0 : { *(.debug_abbrev) }
    	.debug_line			0 : { *(.debug_line) }
    	.debug_frame		0 : { *(.debug_frame) }
    	.debug_str			0 : { *(.debug_str) }
    	.debug_loc			0 : { *(.debug_loc) }
    	.debug_macinfo		0 : { *(.debug_macinfo) }
    	/* SGI/MIPS DWARF 2 extensions */
    	.debug_weaknames	0 : { *(.debug_weaknames) }
    	.debug_funcnames	0 : { *(.debug_funcnames) }
    	.debug_typenames	0 : { *(.debug_typenames) }
    	.debug_varnames		0 : { *(.debug_varnames) }
    
    	.note.gnu.arm.ident	0 : { KEEP (*(.note.gnu.arm.ident)) }
    	.ARM.attributes		0 : { KEEP (*(.ARM.attributes)) }
    	/DISCARD/				: { *(.note.GNU-stack) }
    }
    
    PROVIDE(_text_size = _text_end - _text_start);
    PROVIDE(_data_size = _data_end - _data_start);
    PROVIDE(_bss_size = _bss_end - _bss_start);
    PROVIDE(_stack_size = _stack_end - _stack_start);
    PROVIDE(_heap_size = _ram_end - _end);
    
    /******************************************************************************
    * END OF FILE
    ******************************************************************************/
    

    makefile

    #=============================================================================#
    # ARM makefile
    # 
    # author: Freddie Chopin
    # last change: 2009-06-06
    #
    # this makefile is based strongly on many examples found in the network
    #=============================================================================#
    
    #=============================================================================#
    # toolchain configuration
    #=============================================================================#
    
    TOOLCHAIN = arm-none-eabi-
    
    COMPILER = $(TOOLCHAIN)gcc
    OBJCOPY = $(TOOLCHAIN)objcopy
    ASSEMBLER = $(TOOLCHAIN)gcc -x assembler-with-cpp
    OBJDUMP = $(TOOLCHAIN)objdump
    SIZE = $(TOOLCHAIN)size
    REMOVE = cs-rm
    
    #=============================================================================#
    # project configuration
    #=============================================================================#
    
    # project name
    PROJECT = ARM5
    
    # core type
    CORE = arm7tdmi-s
    
    # linker script
    LINKER_SCRIPT = lpc2148_rom.ld
    
    # output folder
    OUTPUT_DIR = ./out/
    
    # C definitions
    C_DEFS =
    
    # ASM definitions
    ASM_DEFS =
    
    # include directories
    INC_DIR = 
    
    # library directories
    LIB_DIR =
    
    # libraries
    LIBS =-lm
    
    # wildcard for C source files
    C_SRC = $(wildcard *.c)
    
    # wildcard for ASM source files
    ASM_SRC = $(wildcard *.s)
    
    # optimization flags
    OPTIMIZATION = -O0
    
    # set to 'yes' to optimize size by removing unused code and data during link phase
    REMOVE_UNUSED = yes
    
    ifeq ($(REMOVE_UNUSED),yes)
      OPTIMIZATION += -ffunction-sections -fdata-sections
    endif
    
    # define warning options here
    WARNINGS = -Wall -Wstrict-prototypes -Wextra
    
    #=============================================================================#
    # various compilation flags
    #=============================================================================#
    
    # core flags
    CORE_FLAGS = -mcpu=$(CORE)
    
    # flags for assembler 
    ASSEMBLER_FLAGS = $(CORE_FLAGS) -g -ggdb3 -Wa,-amhls=$(OUTPUT_DIR)$(<:.s=.lst) $(ASM_DEFS)
    
    # flags for compiler
    COMPILER_FLAGS = $(CORE_FLAGS) $(OPTIMIZATION) $(WARNINGS) -g -lc -lm -lgcc -ggdb3 -fverbose-asm -Wa,-ahlms=$(OUTPUT_DIR)$(<:.c=.lst) $(C_DEFS)
    
    # flags for linker
    ifeq ($(REMOVE_UNUSED),yes)
      LINKER_FLAGS = $(CORE_FLAGS) -nostartfiles -T$(LINKER_SCRIPT) -g -Wl,-Map=$(OUTPUT_DIR)$(PROJECT).map,--cref,--no-warn-mismatch,--gc-sections $(LIBDIR_F)
    else
      LINKER_FLAGS = $(CORE_FLAGS) -nostartfiles -T$(LINKER_SCRIPT) -Wl,-Map=$(OUTPUT_DIR)$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR_F)
    endif
    
    # flags for objdump
    OBJDUMP_FLAGS = -x --syms
    
    #=============================================================================#
    # do some formatting
    #=============================================================================#
    
    INCDIR_F = $(patsubst %,-I%,$(INC_DIR))
    LIBDIR_F = $(patsubst %,-L%,$(LIB_DIR))
    C_OBJS = $(addprefix $(OUTPUT_DIR),$(C_SRC:.c=.o))
    ASM_OBJS = $(addprefix $(OUTPUT_DIR),$(ASM_SRC:.s=.o))
    OBJS = $(ASM_OBJS) $(C_OBJS)
    DEPS = $(OBJS:.o=.d)
    
    OUT_ELF_F = $(PROJECT).elf
    OUT_HEX_F = $(PROJECT).hex
    OUT_LSS_F = $(PROJECT).lss
    OUT_DMP_F = $(PROJECT).dmp
    OUT_BIN_F = $(PROJECT).bin
    
    OUT_ELF = $(OUTPUT_DIR)$(OUT_ELF_F)
    OUT_HEX = $(OUTPUT_DIR)$(OUT_HEX_F)
    OUT_LSS = $(OUTPUT_DIR)$(OUT_LSS_F)
    OUT_DMP = $(OUTPUT_DIR)$(OUT_DMP_F)
    OUT_BIN = $(OUTPUT_DIR)$(OUT_BIN_F)
    
    # request dependancies
    COMPILER_FLAGS += -MD -MP -MF $(OUTPUT_DIR)$(@F:.o=.d)
    ASSEMBLER_FLAGS += -MD -MP -MF $(OUTPUT_DIR)$(@F:.o=.d)
    
    #contents of output directory
    GENERATED = $(wildcard $(OUTPUT_DIR)*.bin) $(wildcard $(OUTPUT_DIR)*.d) $(wildcard $(OUTPUT_DIR)*.dmp) \
    		$(wildcard $(OUTPUT_DIR)*.elf) $(wildcard $(OUTPUT_DIR)*.hex) $(wildcard $(OUTPUT_DIR)*.lss) \
    		$(wildcard $(OUTPUT_DIR)*.lst) $(wildcard $(OUTPUT_DIR)*.map) $(wildcard $(OUTPUT_DIR)*.o)
    
    #=============================================================================#
    # make all
    #=============================================================================#
    
    all : make_output_dir $(OUT_ELF) $(OUT_LSS) $(OUT_DMP) $(OUT_HEX) $(OUT_BIN) print_size
    
    #-----------------------------------------------------------------------------#
    # linking - objects -> elf
    #-----------------------------------------------------------------------------#
    
    $(OUT_ELF) : $(OBJS) $(USER_OBJS)
    	@echo 'Linking target: $(OUT_ELF_F)'
    	$(COMPILER) $(LINKER_FLAGS) $^ $(LIBS) -o $@
    	@echo ' '
    
    #-----------------------------------------------------------------------------#
    # compiling - C source -> objects
    #-----------------------------------------------------------------------------#
    
    $(OUTPUT_DIR)%.o : %.c
    	@echo 'Compiling file: $<'
    	$(COMPILER) -c $(COMPILER_FLAGS) -I . $(INCDIR_F) $< -o $@
    	@echo ' '
    
    #-----------------------------------------------------------------------------#
    # assembling - ASM source -> objects
    #-----------------------------------------------------------------------------#
    
    $(OUTPUT_DIR)%.o : %.s
    	@echo 'Assembling file: $<'
    	$(ASSEMBLER) -c $(ASSEMBLER_FLAGS) -I . $(INCDIR_F) $< -o $@
    	@echo ' '
    	
    #-----------------------------------------------------------------------------#
    # memory images - elf -> hex, elf -> bin
    #-----------------------------------------------------------------------------#
    
    $(OUT_HEX) : $(OUT_ELF)
    	@echo 'Creating IHEX image: $(OUT_HEX_F)'
    	$(OBJCOPY) -O ihex $< $@
    	@echo ' '
    
    $(OUT_BIN) : $(OUT_ELF)
    	@echo 'Creating binary image: $(OUT_BIN_F)'
    	$(OBJCOPY) -O binary $< $@
    	@echo ' '
    
    #-----------------------------------------------------------------------------#
    # memory dump - elf -> dmp
    #-----------------------------------------------------------------------------#
    
    $(OUT_DMP) : $(OUT_ELF)
    	@echo 'Creating memory dump: $(OUT_DMP_F)'
    	$(OBJDUMP) $(OBJDUMP_FLAGS) $< > $@
    	@echo ' '
    
    #-----------------------------------------------------------------------------#
    # extended listing - elf -> lss
    #-----------------------------------------------------------------------------#
    
    $(OUT_LSS) : $(OUT_ELF)
    	@echo 'Creating extended listing: $(OUT_LSS_F)'
    	$(OBJDUMP) -S $< > $@
    	@echo ' '
    	
    #-----------------------------------------------------------------------------#
    # print the size of the objects and the .elf file
    #-----------------------------------------------------------------------------#
    
    print_size :
    	@echo 'Size of modules:'
    	$(SIZE) -B -t --common $(OBJS) $(USER_OBJS)
    	@echo ' '
    	@echo 'Size of target .elf file:'
    	$(SIZE) -B $(OUT_ELF)
    	@echo ' '
    
    #-----------------------------------------------------------------------------#
    # create the desired output directory
    #-----------------------------------------------------------------------------#
    	
    make_output_dir :
    	$(shell mkdir $(OUTPUT_DIR) 2>/dev/null)
    
    #=============================================================================#
    # make clean
    #=============================================================================#
    
    clean:
    ifeq ($(strip $(OUTPUT_DIR)),)
    	@echo 'Removing all generated output files'
    else
    	@echo 'Removing all generated output files from output directory: $(OUTPUT_DIR)'
    endif
    ifneq ($(strip $(GENERATED)),)
    	$(REMOVE) -f $(GENERATED)
    else
    	@echo 'Nothing to remove...'
    endif
    
    #=============================================================================#
    # global exports
    #=============================================================================#
    
    .PHONY: all clean dependents
    
    .SECONDARY:
    
    # include dependancy files
    -include $(DEPS)
    
  • #5 6855586
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    syscalls.c jest chyba konieczny do funkcji takich jak printf itp? Jak go wywalę, to kompilator zgłasza:
    undefined reference to `_close'
    undefined reference to `_sbrk'
    undefined reference to `_write'
    itd.
  • #6 6855894
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Ehh... No ale może w końcu pokażesz jego zawartość? Jak ktokolwiek ma ci powiedzieć gdzie masz błąd, skoro nie podajesz kodu? Jeśli wziąłeś niezmodyfikowany kod ze strony yagarto, to on nie ma prawa działać z plikami z moich przykładów.

    4\/3!!
  • #7 6855947
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    Nie, nie jest ze strony yagarto.

    Kod main.c
    
    #include "lpc214x.h"
    #include "const_bit.h"
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (void)
    {
      PLLCFG=0x24;			//set multiplier/divider for 60MHz
      PLLFEED=0xAA;
      PLLFEED=0x55;
      PLLCON=0x01;			//enable PLL
      PLLFEED=0xAA;
      PLLFEED=0x55;
      while(!(PLLSTAT & PLOCK));	//wait for PLL to lock to set frequency
      PLLCON=0x3;			//connect PLL as clock source
      PLLFEED=0xAA;
      PLLFEED=0x55;
      MAMCR=0x02;			//enable MAM
      MAMTIM=0x04;			//set number of clocks used for flash memory fetch
      VPBDIV=0x01;			//set peripheral clock (pclk) to system clock (cclk)
    
      IODIR0 = 0xFF000000;
      IODIR1 = 0x00FF0000;
    
      char str[] ="This is a sample string.";
      char * pch;
      char buffer[16];
      float a=1.123;
    
      //Odkomentowanie ktorejkolwiek z ponizszych linijek konczy sie zatzymaniem programu (LED się nie zaświeca);
      //pch = strtok (str," ,.-");
      //sprintf(buf, "a: %f", a);  
      //int *a=(*int)malloc(4*sizeof(int)); 
    
      LED_ON;
    
      while (1)
      {
       
      }
    }
    
  • REKLAMA
  • #9 6856047
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    A chodziło Ci o syscalls.c? Przecież podałem linka w pierwszym poście.
    
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include "uart.h"
    
    /***************************************************************************/
    
    int _read_r (struct _reent *r, int file, char * ptr, int len)
    {
      r = r;
      file = file;
      ptr = ptr;
      len = len;
    
      errno = EINVAL;
      return -1;
    }
    
    /***************************************************************************/
    
    int _lseek_r (struct _reent *r, int file, int ptr, int dir)
    {
      r = r;
      file = file;
      ptr = ptr;
      dir = dir;
    
      return 0;
    }
    
    /***************************************************************************/
    
    int _write_r (struct _reent *r, int file, char * ptr, int len)
    {
      r = r;
      file = file;
      ptr = ptr;
    
      int index;
    
      /* For example, output string by UART */
      for(index=0; index<len; index++)
      {
        UART0_PutChar(ptr[index]);
      }
    
    
      return len;
    }
    
    /***************************************************************************/
    
    int _close_r (struct _reent *r, int file)
    {
      return 0;
    }
    
    /***************************************************************************/
    
    /* Register name faking - works in collusion with the linker.  */
    register char * stack_ptr asm ("sp");
    
    caddr_t _sbrk_r (struct _reent *r, int incr)
    {
      extern char   end asm ("_end"); /* Defined by the linker.  */
      static char * heap_end;
      char *        prev_heap_end;
    
      if (heap_end == NULL)
        heap_end = & end;
    
      prev_heap_end = heap_end;
    
      if (heap_end + incr > stack_ptr)
      {
          /* Some of the libstdc++-v3 tests rely upon detecting
            out of memory errors, so do not abort here.  */
    #if 0
          extern void abort (void);
    
          _write (1, "_sbrk: Heap and stack collision\n", 32);
    
          abort ();
    #else
          errno = ENOMEM;
          return (caddr_t) -1;
    #endif
      }
    
      heap_end += incr;
    
      return (caddr_t) prev_heap_end;
    }
    
    /***************************************************************************/
    
    int _fstat_r (struct _reent *r, int file, struct stat * st)
    {
      r = r;
      file = file;
    
      memset (st, 0, sizeof (* st));
      st->st_mode = S_IFCHR;
      return 0;
    }
    
    /***************************************************************************/
    
    int _isatty_r(struct _reent *r, int fd)
    {
      r = r;
      fd = fd;
    
      return 1;
    }
    
    /*** EOF ***/
    
  • #10 6856071
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    
    caddr_t _sbrk_r (struct _reent *r, int incr) 
    { 
      extern char   end asm ("_end"); /* Defined by the linker.  */ 
    extern char   ram_end asm ("_ram_end");
      static char * heap_end; 
      char *        prev_heap_end; 
    
      if (heap_end == NULL) 
        heap_end = & end; 
    
      prev_heap_end = heap_end; 
    
      if (heap_end + incr > &ram_end) 
      { 
          /* Some of the libstdc++-v3 tests rely upon detecting 
            out of memory errors, so do not abort here.  */ 
          errno = ENOMEM; 
          return (caddr_t) -1; 
      } 
    
      heap_end += incr; 
    
      return (caddr_t) prev_heap_end; 
    }
    


    Stack jest pod heap, więc warunek był u ciebie zawsze niespełniony.

    4\/3!!
  • #11 6856098
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    Dzięki, ale dalej nic... Każda z ww. linijek powoduje "zamrożenie" procka (nie mam jeszcze JTAG'a, więc dokładnie nie powiem, co i jak, ale każda następna instrukcja już się nie wykonuje).
  • #12 6860391
    valarian
    Poziom 22  
    Posty: 647
    Pomógł: 33
    Ocena: 112
    A może ma ktoś przykład, gdzie korzysta np. ze sprintf na LPC2148 i Codesourcery?
  • REKLAMA
  • #13 6865769
    sinuh3
    Poziom 17  
    Posty: 297
    Pomógł: 21
    Ocena: 7
    Sam sprintf powinien działać, na lcd zestawu zl9arm miało to wyświetlać pomiar z adc zewnętrznego.
    Załączniki:
    • SPI1-MAX7219-3.ZIP (194.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy mikrokontrolera LPC2148 i błędów związanych z alokacją pamięci podczas używania funkcji sprintf() (szczególnie z typem float), strtok() oraz printf() w języku C. Funkcje te powodują zawieszenie procesora, mimo że operacje na liczbach float działają poprawnie, a sprintf() z int działa bez problemu. Próby dynamicznej alokacji pamięci przez malloc() również wykazują nieoczekiwane zachowanie – alokacja 4 intów zawiesza system, natomiast 3 inty działają. Użytkownik modyfikował pliki syscalls.c, startup.c oraz linker script lpc2148-rom.ld, korzystając z przykładów Freddiego C i kodu ze strony yagarto.de. W dyskusji podkreślono konieczność prawidłowej implementacji funkcji syscalls, zwłaszcza _sbrk_r, która zarządza stertą, oraz odpowiedniego ustawienia stosu i sterty w startupie. Wskazano, że stos powinien znajdować się pod stertą, a błędne ustawienie może powodować kolizje pamięci i zawieszanie się programu. Użytkownik potwierdził, że po poprawkach problem nadal występuje, a każda instrukcja po wywołaniu problematycznych funkcji nie jest wykonywana. Wskazano, że sprintf() powinien działać poprawnie na LPC2148, co potwierdzają przykłady z zestawu zl9arm. Problem może wynikać z nieprawidłowej konfiguracji pamięci lub implementacji syscalls w środowisku Codesourcery.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA