This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

How To Solve these errors: error: "initializer element is not constant (void (*)(void))​((uint32_t​)&__STACK_​TOP)" and "error: (near initialization for 'g_pfnVectors[0]')"

Hello;

I made a modification in a serial transmitt program in C and it works very well when I send to my Tiva C target from TI, but this program will be a part of a simulink program, so I need to insert the C code with a function block to simulink.

When I debug the code in Simulink I receive these errors:

Building with 'MinGW64 Compiler (C)'. 
C:\Users\Alberto\Desktop\ENVIOS~1\startup_ccs.c:43:20: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
   (void (*)(void))((uint32_t)&__STACK_TOP), 
                    ^ 
C:\Users\Alberto\Desktop\ENVIOS~1\startup_ccs.c:43:3: error: initializer element is not constant 
   (void (*)(void))((uint32_t)&__STACK_TOP), 
   ^ 
C:\Users\Alberto\Desktop\ENVIOS~1\startup_ccs.c:43:3: error: (near initialization for 'g_pfnVectors[0]') 
gmake: *** [startup_ccs.obj] Error -1

I don't understan the problem, because the code in C directly installed in the target works fine, but I was searching for days and I can't find the problem.

This is the C code:

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include "hw_ints.h"
#include "hw_memmap.h"
#include "debug.h"
#include "fpu.h"
#include "gpio.h"
#include "interrupt.h"
#include "pin_map.h"
#include "rom.h"
#include "sysctl.h"
#include "uart.h"
char car[2000];
double u;
void UARTSend2(const uint8_t *pui8Buffer, uint32_t ui32Count);
//*****************************************************************************
// Send a string to the UART.
void UARTSend2(const uint8_t *pui8Buffer, uint32_t ui32Count)
{
	    ROM_FPUEnable(); // Enable lazy stacking for interrupt handlers.  This allows floating-point
	    ROM_FPULazyStackingEnable(); // instructions to be used within interrupt handlers, but at the expense of extra stack usage.
	    ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // Set the clocking to run directly from the crystal.
	    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);    // Enable the GPIO port that is used for the on-board LED.
	    ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); // Enable the GPIO pins for the LED (PF2).
	    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // Enable the peripherals used by this example.
	    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
	    ROM_IntMasterEnable(); // Enable processor interrupts.
	    GPIOPinConfigure(GPIO_PA0_U0RX); // Set GPIO A0 and A1 as UART pins.
	    GPIOPinConfigure(GPIO_PA1_U0TX);
	    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
	    ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 115200,  // Configure the UART for 115,200, 8-N-1 operation.
	                            (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
	                             UART_CONFIG_PAR_NONE));
      while(ui32Count--) // Loop while there are more characters to send.
      {
          ROM_UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++);  // Write the next character to the UART.
      }
    }
  //*****************************************************************************
  // This example demonstrates how to send a string of data to the UART.
  int
  main(double u)
  {
      	u=1234;
      	int cont=(log10(u))+6;
      	sprintf (car,"%.2f\r\n",u);
      	UARTSend2((uint8_t *) car,cont); // Prompt for text to be entered.
}

And this is the block of the code where Simulink notify the error in the file startup_ccs.c:

//*****************************************************************************
//
// External declaration for the interrupt handler used by the application.
//
//*****************************************************************************
//extern void UARTIntHandler(void);
//*****************************************************************************
//
// The vector table.  Note that the proper constructs must be placed on this to
// ensure that it ends up at physical address 0x0000.0000 or at the start of
// the program if located at a start address other than 0.
//
//*****************************************************************************
#pragma DATA_SECTION(g_pfnVectors, ".intvecs")
void (* const g_pfnVectors[])(void) =
{
  (void (*)(void))((uint32_t)&__STACK_TOP),
                                            // The initial stack pointer
    ResetISR,                               // The reset handler
    NmiSR,                                  // The NMI handler
    FaultISR,                               // The hard fault handler
    IntDefaultHandler,                      // The MPU fault handler
    IntDefaultHandler,                      // The bus fault handler
    IntDefaultHandler,                      // The usage fault handler
    0,                                      // Reserved
    0,                                      // Reserved

The code of this file it's very large so I only insert the part of the error.

Can you help me to solve it?

Thanks a lot

Regards Alberto

  • user4663990 said:
    I don't understan the problem, because the code in C directly installed in the target works fine, but I was searching for days and I can't find the problem.

    For the Tiva C target the address of the __STACK_TOP extern variable is defined by the linker.

    It looks like the PC MinGW64 Compiler doesn't allow the address of an extern variable to be used to initialize an array.

    The contents of the startup_ccs.c is intended to provide the start-up vectors and code when running on a Tiva C target, so do you actually require the startup_ccs.c file to be compiled by by Simulink?

    e.g. does Simulink provide it's own startup code?