STM32 iki main fonksiyonu

Başlatan mr.engineer, 23 Ocak 2020, 23:27:01

HAKKITANIR

#15
anlatım tarzınız süperdi. harikaydı. öğretmenlik var mı?
acaba dsPIC serisi de yapar mı ki bu işi?
daha önce while(1) dışına, jump label işlemi denemiş başarılı olamamıştım.
derleyici kabul etmedi.
üzerinde de pek durmadım aslında, sadece  deneme amaçlı bir çalışmaydı.
birde ben bu jump label kodunun mantığını da pek sevmedim.
kafamı karıştırıyor, alışmışız programın normal akışta gitmesine.
çok kural dışı gibi geliyor bana,
ancak bunu kullanmaya çok mecbursak ve yapacak bir şey kalmamışsa kullanılabilir.
şimdiye kadar, gerçek çalışmalarımda hiç kullanmadım jump label ikilisini.
çok uzun, hafıza dolduracak kadar karmaşık kod yazmışlığım da yok aslında.
en fazla 1500 satır %30 hafıza doluluğu yakalabildim. böyle iş denk geldi.
genelde 1000 satır altı, %15 civarıyla işim olmuş oluyor.

volkanunal

Alıntı yapılan: HAKKITANIR - 29 Ocak 2020, 11:03:58anlatım tarzınız süperdi. harikaydı. öğretmenlik var mı?

Merhabalar hocam, öğretmenlik mesleğine atılmayı çok istemiştim. Öğretmen lisesi çıkışlıyım ve ek puan ile birlikte sınava girip ucu çiğneyip tükürsek kazanabiliyorduk öğretmenlik mesleğini. Sınava falan girdik, açıklandı benim tek tercih matematik öğretmenliği olacaktı.

Sonrasında kılavuz açılandı, dediler ki bu sene matematik öğretmenliği alımı yapmayacağız. Sadece ilköğretim matematikleri açık bırakılmıştı. Sonra elektrik-elektronik mühendisliğini tamamladım :)

Anlatmayı çok seviyorum, şöyle bir youtube kanalım var ilginizi çeker ise,

https://www.youtube.com/c/volkansspace

Primum nil nocere

HAKKITANIR

bu yaşta süper bilgi birikiminiz var gibi geldi bana.
kanalınıza gidip videolarınızı,
ve burada yazdığınız mesajlarınızı komple inceleyeceğim.
şaşırdığım enteresan anlardan birisi oldu benim için.
anlatım için teşekkürler. elinize gözünüze sağlık.

volkanunal

Alıntı yapılan: HAKKITANIR - 29 Ocak 2020, 11:24:32bu yaşta süper bilgi birikiminiz var gibi geldi bana.
kanalınıza gidip videolarınızı,
ve burada yazdığınız mesajlarınızı komple inceleyeceğim.
şaşırdığım enteresan anlardan birisi oldu benim için.
anlatım için teşekkürler. elinize gözünüze sağlık.

Yukarda bulunan mesajınızı güncellemişsiniz sanırım,

bazen bu tarz senaryoları kullanmanız gerekmekte. Örneğin kendi cihazımız için konuşacak olursak, uzaktan cihaz içerisinde bulunan yazılımı güncelliyoruz ve bunu farklı bir sektöre yazıyoruz. Daha sonra bu imajı çalıştırırken, cihaz o sektörde bir güncelleme var mı diye bakıyor ayağa kalktığında ve var ise oradan atlayıp oradan devam ediyor. Ana imajı değiştirmiyoruz bu sayede.

Primum nil nocere

mr.engineer

Herkese yardımları için teşekkür ediyorum. Hallettim.

volkanunal

Alıntı yapılan: mr.engineer - 31 Ocak 2020, 01:41:07Herkese yardımları için teşekkür ediyorum. Hallettim.

Bence halletme metodlarınızı buraya koyarsanız, benzer sorularla araştırma yapan arkadaşlar faydalanırlar.
Primum nil nocere

HAKKITANIR

Evet katılıyorum, sizin çözüm yönteminizi bende bilmek isterim.
Aklımın bir köşesinde dip not olarak bulunsun.
Lazım olursa döner bulur, bir gün kullanırım bu bilgiyi.
Bir daha denk gelmez belki böyle bir soru ve konu.

mr.engineer

Merhaba, biraz geç oldu ama yine de nasıl yaptığımdan bahsedeyim. Volkanunal arkadaşımızın anlattığı şekilde yaptım. O yüzden her şeyi tekrar yazmıyorum. Sadece tek fark benim kullandığım kart Cortex M0 işlemcisine sahip ve bu işlemci VTOR registerına sahip değil. Dolayısıyla vector table'ın yeni konumunu kendimiz ayarlıyoruz. Aşağıda kodu paylaşıyorum.


#define FW_START_ADDR 0x08010000
volatile uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));
void remapMemToFlash( void )
{
    uint32_t vecIndex = 0;
    __disable_irq();
 
    for(vecIndex = 0; vecIndex < 48; vecIndex++){
        VectorTable[vecIndex] = *(volatile uint32_t*)(FW_START_ADDR + (vecIndex << 2));
    }
		__HAL_SYSCFG_REMAPMEMORY_SRAM();
 
    __enable_irq();
}

Burada yapılan şey vector table'ı SRAM'e kaydetmek.(Vector relocation). Cortex M0+ işlemcilerde bu işleme gerek yok. Volkan arkadaşımızın yaptığı gibi sadece VTOR registerını ayarlamak yeterli. Jump fonksiyonları aynı olduğu için tekrar paylaşmıyorum.

kralsam

Bu işlemi Atolic TrueStudio da deneyen var mı? Çözüm ararken burada tartışıldığına rast geldim. Sorayım dedim. Uygulama içinde fonksiyon pointer ile dallanıyorum fakat HardFault yiyor. En kötü ihtimal ikinci sektörde patlıyor(HardFault). Projeyi hız amaçlı CubeMX ile oluşturmuştum.

Hatta en son yönlendirmeyi 0x8000004 adresine yaptım ki yeniden çalıştığını bileyim. Ama çalışmıyor. Fikir verebilecek var mı?

volkanunal

Alıntı yapılan: kralsam - 03 Mayıs 2020, 19:48:58Bu işlemi Atolic TrueStudio da deneyen var mı? Çözüm ararken burada tartışıldığına rast geldim. Sorayım dedim. Uygulama içinde fonksiyon pointer ile dallanıyorum fakat HardFault yiyor. En kötü ihtimal ikinci sektörde patlıyor(HardFault). Projeyi hız amaçlı CubeMX ile oluşturmuştum.

Hatta en son yönlendirmeyi 0x8000004 adresine yaptım ki yeniden çalıştığını bileyim. Ama çalışmıyor. Fikir verebilecek var mı?

Kodlarınızı paylaşabilir misiniz, main stack pointeri doğru yere konumlandırdığınıza emin misiniz jump etmeden önce
Primum nil nocere

MrDarK

Konu Attolic keil veya iar la alakası yok. Tamamen arm mimarisine göre mcu yu init edip yönlendirmek. Kodları görelim :)
Picproje Eğitim Gönüllüleri ~ MrDarK

kralsam

Alıntı yapılan: volkanunal - 03 Mayıs 2020, 22:30:56Kodlarınızı paylaşabilir misiniz, main stack pointeri doğru yere konumlandırdığınıza emin misiniz jump etmeden önce
Alıntı yapılan: MrDarK - 03 Mayıs 2020, 23:09:41Konu Attolic keil veya iar la alakası yok. Tamamen arm mimarisine göre mcu yu init edip yönlendirmek. Kodları görelim :)

Buyrun :)

volatile uint32_t appAddr = 0x08004000;
void goApptoAddr(void (*appAddrFunc)(void)) //Adresteki Uygulamaya git.
{
 static uint32_t * vtorReg;

 HAL_DeInit();

 __disable_irq();
 __set_MSP(appAddr);

 vtorReg = (uint32_t *)0xe000ed08;
 *vtorReg = appAddr;

 appAddrFunc();
}

Kullanırken :
goApptoAddr((void (*)(void))(appAddr+4));

Bu arada bir kaç kez compiler ve linker sorunundan farklı işlemci mimarilerinde sorun yaşamıştım. Öyle birşey olabilir mi gibisinden sordum.

volkanunal

Alıntı yapılan: kralsam - 03 Mayıs 2020, 23:17:27Buyrun :)

volatile uint32_t appAddr = 0x08004000;
void goApptoAddr(void (*appAddrFunc)(void)) //Adresteki Uygulamaya git.
{
 static uint32_t * vtorReg;

 HAL_DeInit();

 __disable_irq();
 __set_MSP(appAddr);

 vtorReg = (uint32_t *)0xe000ed08;
 *vtorReg = appAddr;

 appAddrFunc();
}

Kullanırken :
goApptoAddr((void (*)(void))(appAddr+4));

Bu arada bir kaç kez compiler ve linker sorunundan farklı işlemci mimarilerinde sorun yaşamıştım. Öyle birşey olabilir mi gibisinden sordum.

MSP yanlış kuruluyor. O adreste bulunan değeri almanız gerekiyor. Adresin kendisini değil. Debug modda başlatıp memory layout'u açın. O adrese gidin görünürlüğü u32'e çevirin değeri göreceksiniz. Siz adresi main stack pointer olarak gönderiyorsunuz.

__set_MSP(*(__IO uint32_t*)0x08000000);

Ayrıca main stack pointer vector tablosunda ilk sırada yer alır, siz yine ofset adres vermişsiniz.

Eğer burada yaptığınız değer verme işlemi ise
 vtorReg = (uint32_t *)0xe000ed08;
 *vtorReg = appAddr;

yanlış olmuş anladığım kadarıyla.


Primum nil nocere

muhendisbey

Alıntı yapılan: kralsam - 03 Mayıs 2020, 19:48:58Bu işlemi Atolic TrueStudio da deneyen var mı? Çözüm ararken burada tartışıldığına rast geldim. Sorayım dedim. Uygulama içinde fonksiyon pointer ile dallanıyorum fakat HardFault yiyor. En kötü ihtimal ikinci sektörde patlıyor(HardFault). Projeyi hız amaçlı CubeMX ile oluşturmuştum.

Hatta en son yönlendirmeyi 0x8000004 adresine yaptım ki yeniden çalıştığını bileyim. Ama çalışmıyor. Fikir verebilecek var mı?

Atolic'i denedim ama doğru çalışmadığına kanaat getirdim. Aynı projede her derlememde farklı noktalarda (dediği hatayı düzeltmediğim halde) hata veriyordu. Asıl hata dışında her yeri dönderdi sağolsun. Ben de canım programım keil'e geri döndüm. Coocox'u denemeyi çok istemiştim proje sonlanmış, deneme yapmaya fırsat bulamadım.

Ti programlıyorsam bazen code composer kullanıyorum, bir kampanyadan lisansı neredeyse ücretsize gelmişti. Arada sırada komutu iki kez vermem gerekiyor tek problemi bu. Mesela debug çalıştıracaksam iki kez basmazsam debug işlemine geçmiyor, ya da yükleme yapacaksam iki kez load demem gerekiyor. Bazen de bunlara bastığımda hata verip çıkıyor. Her derleme öncesi kaydediyorum.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

kralsam

#29
Alıntı yapılan: volkanunal - 04 Mayıs 2020, 01:33:22MSP yanlış kuruluyor. O adreste bulunan değeri almanız gerekiyor. Adresin kendisini değil. Debug modda başlatıp memory layout'u açın. O adrese gidin görünürlüğü u32'e çevirin değeri göreceksiniz. Siz adresi main stack pointer olarak gönderiyorsunuz.

__set_MSP(*(__IO uint32_t*)0x08000000);

Ayrıca main stack pointer vector tablosunda ilk sırada yer alır, siz yine ofset adres vermişsiniz.

Eğer burada yaptığınız değer verme işlemi ise
 vtorReg = (uint32_t *)0xe000ed08;
 *vtorReg = appAddr;

yanlış olmuş anladığım kadarıyla.




Hocam haklısın hiç dikkatimi çekmemiş. Adresler son denemelerde değiştiği için ofsetli gelmiş. Teşekkür ederim 😊 Bir deneyim bakalım.

yeni hali

volatile uint32_t appAddr = 0x08000000;
void goApptoAddr(void (*appAddrFunc)(void)) //Adresteki Uygulamaya git.
{
	static uint32_t * vtorReg;

	HAL_DeInit();

	__disable_irq();
	__set_MSP(*(uint32_t *)appAddr);

	vtorReg = (uint32_t *)0xe000ed08;
	*vtorReg = appAddr;

	appAddrFunc();
}
Debug ettiğimde VTOR atamasının doğru çalıştığını görüyorum. Bu arada bu şekilde de çalışmadı.