Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: Kırambor - 12 Temmuz 2022, 15:51:58

Başlık: Keil-Debug'da Program Terminated Hatası
Gönderen: Kırambor - 12 Temmuz 2022, 15:51:58
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:


(https://i.ibb.co/7yp6shp/xx.png) (https://ibb.co/7yp6shp)

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.
Başlık: Ynt: Keil-Debug'da Program Terminated Hatası
Gönderen: z - 12 Temmuz 2022, 23:51:40
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.


Başlık: Ynt: Keil-Debug'da Program Terminated Hatası
Gönderen: RaMu - 13 Temmuz 2022, 09:49:01
Printf 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
Başlık: Ynt: Keil-Debug'da Program Terminated Hatası
Gönderen: Kırambor - 14 Temmuz 2022, 23:40:33
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);
}


(https://i.ibb.co/D76vPSB/xde.png) (https://ibb.co/D76vPSB)


(https://i.ibb.co/rpBL2gS/xee.png) (https://ibb.co/rpBL2gS)
Başlık: Ynt: Keil-Debug'da Program Terminated Hatası
Gönderen: z - 15 Temmuz 2022, 14:29:03
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

Başlık: Ynt: Keil-Debug'da Program Terminated Hatası
Gönderen: Kırambor - 04 Ağustos 2022, 09:55:22
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 (https://developer.arm.com/downloads/-/legacy-compilers) "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.