I am trying to convert a TIABI project for TMS470 WEGA to EABI. I had a working project for TIABI. It seems to work for the most part, except the part with initialized globals.
I used init script that was in the "TMS470 ARM ABI Migration" file, but it doesn't work. I'm guessing I have issues with the linker file. Can anyone help me with this?
When I run the init part up until main function, uninitialized variables are set to 0, which is correct, but initialized variables are not initialized. Instead, they have 0xFFFFFFFF value.
I'm using TMS470 v4.6.4.
My linker file:
/****************************************************************************************/
/* OPTIONS */
/****************************************************************************************/
-c /* LINK USING C CONVENTIONS */
-a
-stack 0x1000 /* SOFTWARE STACK SIZE */
-heap 0x2000 /* HEAP AREA SIZE */
/****************************************************************************************/
/* SPECIFY THE SYSTEM MEMORY MAP */
/****************************************************************************************/
MEMORY
{
VECTORS (X) : origin=0x0000000 length=0x20
ROM (RX) : origin=0x0000030 length=0x00009000
STACKS (RW) : origin=0x08002000 length=0x00002000
RAM (RW) : origin=0x08004000 length=0x00005000
APIRAM (RW) : origin=0x01800000 length=0x01000
/* peripherals */
HETPROG (RW) : origin=0x00900000 length=0x800
EXTCAN (RW) : origin=0x00190000 length=0x600
DPRAM_ETH(RW) : origin=0x00200000 length=0xFFFF
ADC (RW) : origin=0xfff7f000 length=0x100
API (RW) : origin=0xfff7c400 length=0x400
SCCRAM0 (RW) : origin=0xfff7dc00 length=0x400
SCC0 (RW) : origin=0xfff7e000 length=0x400
HCCRAM0 (RW) : origin=0xfff7e400 length=0x400
HCC0 (RW) : origin=0xfff7e800 length=0x400
GIO0 (RW) : origin=0xfff7ec00 length=0x400
/* A2D0 (RW) : origin=0xfff7f000 length=0x400*/
SCI0 (RW) : origin=0xfff7f400 length=0x400
SPI0 (RW) : origin=0xfff7f800 length=0x400
HET0 (RW) : origin=0xfff7fc00 length=0x400
/* sar module addresses */
MMC (RW) : origin=0xFFFFFD00 length=0x40
DEC (RW) : origin=0xFFFFFE00 length=0x60
SYS (RW) : origin=0xFFFFFFD0 length=0x30
CMRTI (RW) : origin=0xFFFFFF00 length=0xcf /* Clock module & Real Time Interrupt */
}
/****************************************************************************************/
/****************************************************************************************/
/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */
/****************************************************************************************/
SECTIONS
{
.intvecs : {} > VECTORS /* INTERRUPT VECTORS */
.startup : {} > 0x00000030 /* START ADDRESS */
.stack : {
_StackUSER_ = .+ (0x1000 - (4+128+4+4+512));
_StackFIQ_ = _StackUSER_ + 4;
_StackIRQ_ = _StackFIQ_ + 128;
_StackABORT_ = _StackIRQ_ + 4;
_StackUND_ = _StackABORT_ + 4;
_StackSUPER_ = _StackUND_ + 512;
} > STACKS /* SOFTWARE SYSTEM STACK */
.bss : {} > RAM /* GLOBAL & STATIC VARS */
.sysmem : {} > RAM /* DYNAMIC MEMORY ALLOCATION AREA */
.text : {} > ROM /* CODE */
.cinit : {} > ROM /* INITIALIZATION TABLES */
.const : {} > ROM /* CONSTANT DATA */
.ADC : {_e_ADC1 = .;} > ADC
.APIRAM : {_e_APIRAM = .;} > APIRAM
.API : {_e_SARAPI_ST = .;} > API
.SPI0 : {_e_SPI0_ST = .;} > SPI0
.SCI0 : {_e_SCI0_ST = .;} > SCI0
.GIO0 : {_e_GIO_ST = .;} > GIO0
.HET0 : {_e_HET0_ST = .;} > HET0
/* .A2D0 : {_e_A2D0_ST = .;} > A2D0*/
.SCC0 : {_e_CAN0_ST = .;} > SCC0
.HCC0 : {_e_CAN1_ST = .;} > HCC0
.HETCODE : { _e_HETPROGRAM0_UN = .;} > HETPROG /* HET PROGRAM */
.MMC : {_e_SARMMC_ST = .;} > MMC
.DEC : {_e_SARDEC_ST = .;} > DEC
.SYS : {_e_SARSYS_ST = .;} > SYS
.CIM : {_e_SARCIM_ST = .+0x20;} > CMRTI
.CMRTI : {_e_SARRTI_ST = .;} > CMRTI
.EXTCAN : {_g_CanController = .;} > EXTCAN
/*
.EXTCAN : {_g_CanController2_st = .+0x100;} > EXTCAN
.EXTCAN : {_g_CanController3_st = .+0x200;} > EXTCAN
.EXTCAN : {_g_CanController4_st = .+0x300;} > EXTCAN
.EXTCAN : {_g_CanController5_st = .+0x400;} > EXTCAN
.EXTCAN : {_g_CanController6_st = .+0x500;} > EXTCAN
*/
.DPRAM_ETH : {} > DPRAM_ETH
}
&"&"&"
-o %2
My init script:
/*----------------------------------------------------------------------------*/
#include "lld_types.h"
#include "TMS470Wega.h"
/*----------------------------------------------------------------------------*/
void auto_initialize();
typedef void (*handler_fptr)(const unsigned char *in,
unsigned char *out);
#define HANDLER_TABLE __TI_Handler_Table_Base
#pragma WEAK(HANDLER_TABLE)
extern unsigned int HANDLER_TABLE;
extern unsigned char *__TI_CINIT_Base;
extern unsigned char *__TI_CINIT_Limit;
extern unsigned int __TI_Handler_Table_Limit;
/*----------------------------------------------------------------------------*/
/* system registers */
// lots of code which I cut out
/*----------------------------------------------------------------------------*/
/* Startup Routine */
void c_int00()
{
/* start pll lock */
SYSTEM->CSDISCLR = 0x02;
/* stacks */
asm(" ldr sp,[pc]"); /* svc stack */
asm(" mov pc,pc");
asm(" .word 0x08001100");
asm(" mov r0,#0xD1"); /* fiq stack */
asm(" msr cpsr,r0");
asm(" ldr sp,[pc]");
asm(" mov pc,pc");
asm(" .word 0x08001200");
asm(" mov r0,#0xD2"); /* irq stack */
asm(" msr cpsr,r0");
asm(" ldr sp,[pc]");
asm(" mov pc,pc");
asm(" .word 0x08001300");
asm(" mov r0,#0xDF"); /* user/system stack */
asm(" msr cpsr,r0");
asm(" ldr sp,[pc]");
asm(" mov pc,pc");
asm(" .word 0x08001000");
/* Initialize VIM table */
{
unsigned i;
for (i = 0; i < 96; i++)
{
VIM_RAM->ISR[i] = s_vim_init[i];
}
}
/* initalise the C global variables */
auto_initialize();
/* power-up peripharals */
PCR->PSPWRDWNCLR0 = 0xFFFFFFFF;
PCR->PSPWRDWNCLR1 = 0xFFFFFFFF;
PCR->PSPWRDWNCLR2 = 0xFFFFFFFF;
PCR->PSPWRDWNCLR3 = 0xFFFFFFFF;
/* enable peripharals */
SYSTEM->CLKCNTL = 0x01010100;
/* set IRQ/FIQ priorities */
VIM->FIRQPR0 = 0x00000000;
VIM->FIRQPR1 = 0x00000000;
VIM->FIRQPR2 = 0x00000000;
/* enable interrupts */
VIM->REQMASKSET0 = 0x00000fff;
VIM->REQMASKSET1 = 0x00000000;
VIM->REQMASKSET2 = 0x00000000;
PCR->PCSPWRDWNSET0 = 0xFFFFFFFF;
PCR->PCSPWRDWNSET1 = 0xFFFFFFFF;
SYSTEM->SYSPC1 = 0x00000001;
SYSTEM->SYSPC2 = 0x00000001;
/* call the application */
main();
exit();
}
/*----------------------------------------------------------------------------*/
void auto_initialize()
{
unsigned char **table_ptr;
unsigned char **table_limit;
/*--------------------------------------------------------------*/
/* Check if Handler table has entries. */
/*--------------------------------------------------------------*/
if (&__TI_Handler_Table_Base >= &__TI_Handler_Table_Limit)
return;
/*---------------------------------------------------------------*/
/* Get the Start and End of the CINIT Table. */
/*---------------------------------------------------------------*/
table_ptr = (unsigned char **)&__TI_CINIT_Base;
table_limit = (unsigned char **)&__TI_CINIT_Limit;
while (table_ptr < table_limit)
{
/*-------------------------------------------------------------*/
/* 1. Get the Load and Run address. */
/* 2. Read the 8-bit index from the load address. */
/* 3. Get the hander function pointer using the index from */
/* handler table. */
/*-------------------------------------------------------------*/
unsigned char *load_addr = *table_ptr++;
unsigned char *run_addr = *table_ptr++;
unsigned char handler_idx = *load_addr++;
handler_fptr handler =
(handler_fptr)(&HANDLER_TABLE)[handler_idx];
/*-------------------------------------------------------------*/
/* 4. Call the handler and pass the pointer to the load data */
/* after index and the run address. */
/*-------------------------------------------------------------*/
(*handler)((const unsigned char *)load_addr, run_addr);
}
}