Derle + yükle + Debug moduna geç

Başlatan z, 24 Eylül 2012, 00:46:37

z

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ı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

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;
				
			}
	
}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

camby

Kesmeye Break koyup run dediğinizde oraya geliyor mu ?

mistek

hocam break dediğiniz kod olarak break mi yoksa kırmızı breakpoint mi?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

camby


mistek

Kesme fonksiyonunun yanına breakpoint koyunca kesmeye girdi. Basıyorum çekiyorum aradan 2-3 saniye geçtikten sonra kesme fonksiyonuna gidiyor.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhittin_kaplan

debug modda zamanlama gerçek olmaz
(her komut iletilmesinde bilgisayara veri gönderir alır vs den dolayı.)

mistek

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.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

muhittin_kaplan

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

camby

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..

mistek

Breakpointler sadece kesmeleri göstermek içinmi kullanılıyor? Kafama göre her kesmenin yanına koysam ne olur? ?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Burak B

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.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle