Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 24 Eylül 2012, 00:46:37

Başlık: Derle + yükle + Debug moduna geç
Gönderen: z - 24 Eylül 2012, 00:46:37
Keil'i Rebuild butonuna basarak programı derle ve çipe yükle ardından da debug penceresini aç şeklinde kullanıyorum.
Ancak bazen Rebuild'e bastığımda derleme hatasız gerçekleşip çipe yükleme gerçekleştiği halde bazen (%70) debug penceresi açılmıyor. (32K ile limitlisiniz uyarısı da gemiyor)

Debug penceresi otomatik açılmadıysa debug tuşuna basmam gerekiyor.

Keil'in bu şekilde davranmasının sebebi nedir?

Keil'i çok sık güncellemiyorum. Son versiyonun bir öncek versiyondan farklılığını, hangi hatalarını düzeltterek yeni versiyon oluşturduklarına dair bir link varmı?
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: mistek - 23 Ağustos 2013, 16:42:21
Keilde ulink2 kullanarak debug yapmak istedim. Yani debug deyince benim aklıma sistemi adım adım çalıştırıp dış dünya ile haberleşmek geliyor.
Tuşa bastığımda yükselen ve düşen kenarda tetiklenen harici kesme ile bir ledi yakıp söndürmek istedim oldu. Programı derleyip yükledim istediğim gibi çalışıyor. Ama debug moda girdiğimde programı adım adım işletiyorum (F11) while içerisinde sürekli dönüyor.

İlgili butona bastığımda kesme gelmiyor yani debug modda hiç kesme alt programına gidemedim. Biyerlerin ayarlanması mı lazım yoksa böyle bişey yok mu?

Main.c

#include <stm32f10x_conf.h>
#include <stm32f10x.h>


int32_t i=0, j=0;
uint16_t led =0;
uint16_t programsayaci=0;

int main(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //Output
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource11);
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0E;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

    for(i=0; i<5; i++);

    while (1)
    {
for(i=0; i<5; i++);
GPIOC -> BRR = 1<<3;

}
}


Kesme fonk.
void EXTI3_IRQHandler(void)
{
if( EXTI_GetITStatus(EXTI_Line3) != RESET )
{
EXTI_ClearITPendingBit(EXTI_Line3);
GPIOC->ODR =  1 << 3;

}

}

void EXTI15_10_IRQHandler(void)
{
if( EXTI_GetITStatus(EXTI_Line11) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line11);
GPIOC->ODR =  1 << 3;

}

}
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: camby - 26 Ağustos 2013, 12:49:18
Kesmeye Break koyup run dediğinizde oraya geliyor mu ?
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: mistek - 26 Ağustos 2013, 12:53:29
hocam break dediğiniz kod olarak break mi yoksa kırmızı breakpoint mi?
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: camby - 26 Ağustos 2013, 13:14:25
breakpoint , debugda kullanılan
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: mistek - 26 Ağustos 2013, 13:46:33
Kesme fonksiyonunun yanına breakpoint koyunca kesmeye girdi. Basıyorum çekiyorum aradan 2-3 saniye geçtikten sonra kesme fonksiyonuna gidiyor.
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: muhittin_kaplan - 26 Ağustos 2013, 14:12:05
debug modda zamanlama gerçek olmaz
(her komut iletilmesinde bilgisayara veri gönderir alır vs den dolayı.)
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: mistek - 26 Ağustos 2013, 15:04:54
Debug modunda sağ alt köşede t1 zamanı var buna bakarak komutların nekadar sürede işletildiğine bakıyorum. Bu sayaç gerçek zamanımı gösterir yoksa debug esnasındaki haberleşme süresinimi gösterir.
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: muhittin_kaplan - 26 Ağustos 2013, 15:28:36
bu aralar keil kullanmıyorum ama, bir zamanlar arayıpta bulduğum link

interrup zamanı yada iki komut arasındaki zamanı öğrenmek için kullanılan debug scripti (nasıl yapıldığını bilmiyorum)

http://www.keil.com/support/docs/2026.htm (http://www.keil.com/support/docs/2026.htm)
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: camby - 26 Ağustos 2013, 16:21:49
debug gecikmesi olacak muhakkak , debugun çalıştığından emin olun diye breakpoint koyun demiştim , çalışıyormuş. Uzun süredir debug kullanmadım ben de..
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: mistek - 26 Ağustos 2013, 16:51:34
Breakpointler sadece kesmeleri göstermek içinmi kullanılıyor? Kafama göre her kesmenin yanına koysam ne olur? ?
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: z - 26 Ağustos 2013, 17:14:05
Breakpointi istedigin yere koy.

Kodlari adim adim yuruturken orneginde oldugu gibi int da uretiliyorsa interrupta derhal cevap verilmiyor.

Cunku ekranda gorulen registerlerin, ram alaninin rom alaninin gozlenen degiskenlerin cpu'dan pc ye aktarilmasi zaman alan bir islem ve her bir adimlamada tekrarlaniyor. Bu nedenle intlar isin icindeyse adimlatma.

Eger int rutinini debug etmek istiyorsan int rutininin icine breakpoint koy. Yok ana programi debug etmek istiyorsan ana programda ilgilendigin kisma breakpoint koy. Programi kostur ve tuzaga dusmesini bekle. Tuzaga dustumu adimlatacaksan adimlat.

Debug etmek icin yuzlerce satiri adimlatmak anlamsiz zaten. Suphelendigin rutini adimlat sadece.
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: X-Fi - 26 Ağustos 2013, 19:24:56
Ek bildi olarak, keil debug modunda "set the program counter" denen güzel bir olay var. İşlemciyi seçtiğin program satırına atlatabiliyorsun. Ben bunu hiçbir 8 bit ve 16 bit mcu da görmemiştim. Debug yapma işlerimi çok kolaylaştırıyor.
Başlık: Ynt: Derle + yükle + Debug moduna geç
Gönderen: Burak B - 26 Ağustos 2013, 23:27:21
Alıntı yapılan: X-Fi - 26 Ağustos 2013, 19:24:56
Ek bildi olarak, keil debug modunda "set the program counter" denen güzel bir olay var. İşlemciyi seçtiğin program satırına atlatabiliyorsun. Ben bunu hiçbir 8 bit ve 16 bit mcu da görmemiştim. Debug yapma işlerimi çok kolaylaştırıyor.

MPLABX' te "Set PC at Cursor" diye geçer. Direkt "Program Counter" modifiye etmek stack ve heap üzerinde dikkat gerektiren bir iş. Özellikle uzun soluklu bir debug işlemi ise.