Keil-Debug'da Program Terminated Hatası

Başlatan Kırambor, 12 Temmuz 2022, 15:51:58

Kırambor

Merhabalar,

Nuvoton'un M031SD2AE işlemcisini Keil'de kodluyorum. Bazen kodun hangi fonksiyonlara girip girmediğini kontrol etmek için printf() fonksiyonuyla random bir şeyler yazdırarak bakmak istiyorum. Bunun için UART0'ı aktif hale getirdim. Ve terminal programı olarak Terminal v1.9b kullanıyorum. USB-TTL dönüştürücüm de bulunmakta. Herhangi bir bağlantı yapmadan önce kodda sorun var mı diye build edip debug modda çalıştırdığımda direkt "Program Terminated Please Stop Debugger" uyarısı aldım.

Kod şu şekilde:

#include "M031Series.h"
#include "stdio.h"

void SYS_Init()
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable clock source */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Waiting for clock source ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Disable PLL first to avoid unstable when setting PLL */
    CLK_DisablePLL();

    /* Set PLL frequency */
    CLK->PLLCTL = (CLK->PLLCTL & ~(0x000FFFFFul)) | 0x0008C03Eul;

    /* Waiting for PLL ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* If the defines do not exist in your project, please refer to the related clk.h in the Header folder appended to the tool package. */
    /* Set HCLK clock */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Set PCLK-related clock */
    CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV1 | CLK_PCLKDIV_APB1DIV_DIV1);

    /* Enable IP clock */
    CLK_EnableModuleClock(ISP_MODULE);
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HIRC_DIV2, 0);

    /* Set IP clock */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_PCLK0, CLK_CLKDIV0_UART0(1));

    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();
		
		//PB12 and PB13 UART0 config
		SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |  \
                    (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Lock protected registers */
    SYS_LockReg();
}

void UART0_Init(void)
{
	SYS_ResetModule(UART0_RST);
	UART_Open(UART0,9600);
}

int main(void)
{
	SYS_Init();
	UART0_Init();
	
	printf("Mahmut");
	
	while(1);
}

Aldığım hata ve debugdaki görüntü şu şekilde:




Acaba buradaki sorun işlemciden mi kaynaklanıyor, yoksa keil'den mi ? Keil'e yeni başladığım için malesef derinlemesine hakim değilim.

z

#1
Reset rutininden itibaren kodu adim adim calistir. Sucluyu ancak bu sekilde bulursun.

SYS_Init in ilk satirina breakpoint koy orda duruyor mu bak.

Hafiye gibi davranman gerekiyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Kırambor

Alıntı yapılan: RaMu - 13 Temmuz 2022, 09:49:01Printf den kaynaklanıyor, semihosting function problemi demişler, birkaç çözüm yolu verilmiş:

https://community.arm.com/support-forums/f/keil-forum/36109/how-to-avoid-bkpt-0xab-instruction
Mikroişlemci üreticisinin sağladığı kütüphaneyi kullanıyorum. Göndermiş olduğunuz linkte retarget.c'yi eklediğim takdirde sorunun çözüleceğini düşünüp kütüphane kısmına retarget.c'yi de ekledim projede. Fakat build ettiğimde retarget.c dosyasından bir error alıyorum. Hataların ekran görüntüleri bu şekilde. Hatayı aldığım HardFault_Handler() fonksiyonunu da kod olarak ekledim. İnternette bakındım fakat assembly bilmediğim için hatanın sebebini anlayamadım. Hata olarak da "error: expected ')'" diyor. Nasıl çözebilirim acaba bu hatayı ?

void HardFault_Handler(void)
{
    asm("MOVS    r0, #4                        \n"
        "MOV     r1, LR                        \n"
        "TST     r0, r1                        \n" /*; check LR bit 2 */
        "BEQ     1f                            \n" /*; stack use MSP */
        "MRS     R0, PSP                       \n" /*; stack use PSP, read PSP */
        "MOV     R1, LR                        \n" /*; LR current value */
        "B       Hard_Fault_Handler            \n"
        "1:                                    \n"
        "MRS     R0, MSP                       \n" /*; LR current value */
        "B       Hard_Fault_Handler            \n"
				::[Hard_Fault_Handler] "r" (Hard_Fault_Handler) // input
    );
    while(1);
}







z

#4
C icinde inline assembly kod yazarken kullanilacak syntax derleyiciye gore degisir.

Salliyorum, her bir satirdaki asm kodunu asagidaki formatta yazmayi dene.

asm("MOVS    r0, #4                      ");

Gerci sende ::[Hard_Fault_Handler] "r" (Hard_Fault_Handler) // input satirina kizmis

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Kırambor

Problemi Nuvoton'a teknik destek ricası maili atarak çözdüm. Problem kullandığım arm compiler'ın versiyonundan dolayı imiş. Versiyon 6 ve 5 birbiriyle uyumlu olmadığı için retarget.c compiler version 5'i destekliyormuş. Fakat ben versiyon 6 kullanıyordum.

Aynı problem ile karşılaşan biri olursa bu linkten "Arm Compiler 5.06 update 7 (build 960)" indirin. Compiler'ı  "..\Keil_v5\ARM\" bu dosya uzantısına kurun. Sonrasında compiler seçeneklerinden versiyon 5'i seçip devam edebilirsiniz.