Content originally posted in LPCWare by srinu282 on Mon Nov 26 07:27:48 MST 2012
Hi gregd,
Thanks for u r reply.Using IPC am downloading M0 image in to 0x10080000.Code as follows
/* specify the filename used for the slave image */
#define SLAVE_IMAGE_FILE "CM0_image.c"
/* used to place the CM0_IMAGE array within the "SLAVE IMAGE" section */
#pragma arm section rodata = "M0_SLAVE_IMAGE"
/* fromelf.exe always generates an unsigned char LR0[] type of array */
const/* DO NOT REMOVE THIS CONST QUALIFIER, IS USED TO PLACE THE IMAGE IN M4 ROM */
#include SLAVE_IMAGE_FILE
#pragma arm section rodata
/* return to default scheme */
M0 core is build for RAM not for Flash target.
In Main()
{
IPC_haltSlave();
/* setup the queue system */
IPC_masterInitQueue(&_hostCmdBufferData[0], MASTER_CMDBUF_SIZE, &_hostMsgBufferData[0], SLAVE_MSGBUF_SIZE);
/* download the cpu image */
IPC_downloadSlaveImage(SLAVE_ROM_START, &LR0[0], sizeof(LR0));
/* start the remote processor */
IPC_startSlave();
}.
1.Image downloaded in to flash.
2.Started debugging using ULINK2 on HITEX – A4 board.
3.M4 is working fine with FreeRTOS functionality.
4.M0 core is booting but TaskCreation is failing. Task creation function as follows
#define configMINIMAL_STACK_SIZE( ( unsigned short ) 256 )
xTaskCreate( vM0_Task, ( signed char * ) "M0_Task",
(configMINIMAL_STACK_SIZE*5), NULL, (tskIDLE_PRIORITY + 1UL),
( xTaskHandle * ) NULL );
5.Linkerscript and startup file as follows
M0 Linker script
; M0 image uses local addresses
; absolute addresses are used only for shared buffers
LR_IROM1 0x0 0x8000 { ; load region size_region
; physical address 0x10080000 - 0x10088000
; 32K code space
ER_IROM1 0x0 0x8000 {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
; physical address 0x10088000 - 0x1008A000
; 8 K data space
ER_IRAM1 0x8000 0x2000 {
.ANY (+RW +ZI)
}
; setup a heap using default region name for arm lib "ARM_LIB_HEAP"
ARM_LIB_HEAP +0 EMPTY 0x400 {
}
; setup the stack using default region name for arm lib "ARM_LIB_STACK"
; is growing backwards so will overlap is no space is available
ARM_LIB_STACK 0xA000 EMPTY -0x800 {
}
; these are specified with the physical address since are system level shared memory
ER_IRAM_BUFFERS 0x20004000 0x4000 {
*.o(lowerCaseString_sec)
*.o(directString_sec)
}
ER_IRAM_MBX 0x2000A000 0x2000 {
*.o(Slave_mbxTable) ; hold the mailbox system
}
}
Startup file
/*****************************************************************************/
/* M0 Core */
/*****************************************************************************/
#if defined(CORE_M0)
/* External functions */
extern int __main (void);
/* Default interrupt service routines.
* Defined as weak symbols. Can be redefined in the application.
*/
#define ALIAS(def) __attribute__((weak,alias(#def)))
void Default_IRQHandler (void);
void Reset_Handler (void);
void NMI_Handler (void);
void HardFault_Handler (void);
void BusFault_Handler (void);
void UsageFault_Handler (void);
void Sign_Value (void);
void DebugMon_Handler (void);
void SVC_Handler (void) ALIAS(Default_IRQHandler);
void PendSV_Handler (void) ALIAS(Default_IRQHandler);
void SysTick_Handler (void) ALIAS(Default_IRQHandler);
/* freeRTOS versions of the OS calls */
void vPortSVCHandler (void) ALIAS(Default_IRQHandler);
void xPortPendSVHandler (void) ALIAS(Default_IRQHandler);
void xPortSysTickHandler (void) ALIAS(Default_IRQHandler);
/* hook for the IPC interrupt routine */
void IPC_Master2Slave_IRQHandler(void) ALIAS(Default_IRQHandler);
extern void Image$$ARM_LIB_STACK$$ZI$$Limit;
void DAC_IRQHandler (void) ALIAS(Default_IRQHandler);
void M4_IRQHandler (void) ALIAS(Default_IRQHandler);
void DMA_IRQHandler (void) ALIAS(Default_IRQHandler);
void FLASH_EEPROM_IRQHandler (void) ALIAS(Default_IRQHandler);
void ETH_IRQHandler (void) ALIAS(Default_IRQHandler);
void SDIO_IRQHandler (void) ALIAS(Default_IRQHandler);
void LCD_IRQHandler (void) ALIAS(Default_IRQHandler);
void USB0_IRQHandler (void) ALIAS(Default_IRQHandler);
void USB1_IRQHandler (void) ALIAS(Default_IRQHandler);
void SCT_IRQHandler (void) ALIAS(Default_IRQHandler);
void M0_RIT_OR_WWDT_IRQHandler (void) ALIAS(Default_IRQHandler);
void TIMER0_IRQHandler (void) ALIAS(Default_IRQHandler);
void TIMER1_IRQHandler (void) ALIAS(Default_IRQHandler);
void TIMER2_IRQHandler (void) ALIAS(Default_IRQHandler);
void TIMER3_IRQHandler (void) ALIAS(Default_IRQHandler);
void MCPWM_IRQHandler (void) ALIAS(Default_IRQHandler);
void ADC0_IRQHandler (void) ALIAS(Default_IRQHandler);
void I2C0_IRQHandler (void) ALIAS(Default_IRQHandler);
void I2C1_IRQHandler (void) ALIAS(Default_IRQHandler);
void SPI_IRQHandler (void) ALIAS(Default_IRQHandler);
void ADC1_IRQHandler (void) ALIAS(Default_IRQHandler);
void SSP0_IRQHandler (void) ALIAS(Default_IRQHandler);
void SSP1_IRQHandler (void) ALIAS(Default_IRQHandler);
void UART0_IRQHandler (void) ALIAS(Default_IRQHandler);
void UART1_IRQHandler (void) ALIAS(Default_IRQHandler);
void UART2_IRQHandler (void) ALIAS(Default_IRQHandler);
void UART3_IRQHandler (void) ALIAS(Default_IRQHandler);
void I2S0_IRQHandler (void) ALIAS(Default_IRQHandler);
void I2S1_IRQHandler (void) ALIAS(Default_IRQHandler);
void SPIFI_IRQHandler (void) ALIAS(Default_IRQHandler);
void SGPIO_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO0_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO1_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO2_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO3_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO4_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO5_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO6_IRQHandler (void) ALIAS(Default_IRQHandler);
void GPIO7_IRQHandler (void) ALIAS(Default_IRQHandler);
void GINT0_IRQHandler (void) ALIAS(Default_IRQHandler);
void GINT1_IRQHandler (void) ALIAS(Default_IRQHandler);
void EVRT_IRQHandler (void) ALIAS(Default_IRQHandler);
void CAN1_IRQHandler (void) ALIAS(Default_IRQHandler);
void VADC_IRQHandler (void) ALIAS(Default_IRQHandler);
void ATIMER_IRQHandler (void) ALIAS(Default_IRQHandler);
void RTC_IRQHandler (void) ALIAS(Default_IRQHandler);
void WDT_IRQHandler (void) ALIAS(Default_IRQHandler);
void CAN0_IRQHandler (void) ALIAS(Default_IRQHandler);
void QEI_IRQHandler (void) ALIAS(Default_IRQHandler);
#define SIGN_VALUE 0x5A5A5A5A
/** Vector table. Placed in section called RESET
*/
void (* const vector_table[])(void) __attribute__ ((section("RESET"), used)) =
{
(void(*)(void)) &Image$$ARM_LIB_STACK$$ZI$$Limit,
Reset_Handler,
NMI_Handler,
HardFault_Handler,
0,
0,
0,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSV_Handler,
SysTick_Handler,
RTC_IRQHandler,
IPC_Master2Slave_IRQHandler,
DMA_IRQHandler,
0,
0,
ETH_IRQHandler, /* 21 Ethernet */
SDIO_IRQHandler, /* 22 SD/MMC */
LCD_IRQHandler, /* 23 LCD */
USB0_IRQHandler, /* 24 USB0 */
USB1_IRQHandler, /* 25 USB1 */
SCT_IRQHandler, /* 26 State Configurable Timer */
M0_RIT_OR_WWDT_IRQHandler, /* 27 Repetitive Interrupt Timer - WWDT timer */
TIMER0_IRQHandler, /* 28 Timer0 */
GINT1_IRQHandler,
TIMER3_IRQHandler,
0,
0,
MCPWM_IRQHandler, /* 32 Motor Control PWM */
ADC0_IRQHandler, /* 33 A/D Converter 0 */
I2C0_IRQHandler, /* 34 I2C0 */ //TODO Optional I2C1
SGPIO_IRQHandler, /* 47 SGPIO */
SPI_IRQHandler, /* 36 SPI */ //optional DAC
ADC1_IRQHandler, /* 37 A/D Converter 1 */
SSP0_IRQHandler, /* 38 SSP0 */ //TODO optional SSP1
EVRT_IRQHandler, /* 58 Event Router */
UART0_IRQHandler, /* 40 UART0 */
UART2_IRQHandler, /* 42 UART2 */ //TODO optinbal CAN1
UART3_IRQHandler,
I2S0_IRQHandler, /* 44 I2S0 */ //TODO optional I2S1 or QEI
CAN0_IRQHandler,
};
void Reset_Handler (void) {
/* Jump to the library entry point __main() */
__main();
/* Loop here forever, in case main() ever returns. */
while (1) {
}
}
Please help me to get out of TaskCreation problem