Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: mr.engineer - 23 Ocak 2020, 23:27:01

Başlık: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 23 Ocak 2020, 23:27:01
Merhaba,
STM32 mikrodenetleyicisi (cortex M3) ile içiresinde iki adet uygulama (iki main fonksiyonu) bulunduran bir uygulama yapmak istiyorum. Bootloder'dan jump yapmam gerektiğini öğrendim. Yardım edebilecek olursa sevinirim.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: SpeedyX - 23 Ocak 2020, 23:55:35
İki main demek iki sonsuz döngülü fonksiyon demek.
Açılışta bir pine, eepromdaki bir değere yada neye istersen bakarak hangini çağıracağına karar verip gir birine.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 24 Ocak 2020, 00:04:01
Alıntı yapılan: SpeedyX - 23 Ocak 2020, 23:55:35İki main demek iki sonsuz döngülü fonksiyon demek.
Açılışta bir pine, eepromdaki bir değere yada neye istersen bakarak hangini çağıracağına karar verip gir birine.


Bootlader kullanarak yapmak istedim. Bir jump fonksiyonu ile bootloader'a daha sonra da diğer main'e geçmeyi düşünmüştüm.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: e-zeki - 24 Ocak 2020, 08:23:32
Alıntı yapılan: mr.engineer - 24 Ocak 2020, 00:04:01Bootlader kullanarak yapmak istedim. Bir jump fonksiyonu ile bootloader'a daha sonra da diğer main'e geçmeyi düşünmüştüm.

Böyle bir işlem için Bootloader'a gidip gelmene gerek yok.
Eğer RAM ve ROM yeterliyse @SpeedyX 'in dediği gibi uğraşmadan 2 sonsuz döngü ile işini görürsün.
Yok illa 2 ayrı hex dosyası tek işlemcide koşsun istiyorsan ve bu kodlar güncellenmeyecekse yine bootloader'a ihtiyacın yok. Sadece Jump fonksiyonu kullanarak 2 hex arasında gidip gelebilirsin.
Jump kod için dün @MrDarK 'ın verdiği örnek kodu kullanabilirsin.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: z - 24 Ocak 2020, 09:58:38
Bu iki program fakli kisilerce bagimsiz gelistirilecekse biraz sikinti var.

Eger ortaklasa yazilacaksa sorun yok.

Sorun int vector tablosunda olacak gibi gorunuyor.

Her program parcasi kendi int tablosuna sahip olmali. Eger ortaklasa calisma yapilacaksa bu int fonksiyonlari birlikte yazilmali.

Eger iki ayri vector tablosu yapilacaksa bu kez program gecislerinde vector tablosunun adresinin de set edilmesi gerekecek.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: MrDarK - 24 Ocak 2020, 10:16:18
- İki ayrı uygulama denince iki ayrı proje deniyor ise her projeyi ayrı ayrı oluşturacaksınız.
- Her uygulama için ROM alanını hesalayıp haritalandıracaksınız. Örn 0 - 0x100 arası 1.uygulama, 0x100 - 0x200 arası 2. uygulama gibi
- Sonrasında her projenin .ld (attolic/gcc için) uzantılı dosyasını açıp yukarıda belirttiğim rom alanlarını güncelleyeceksiniz.
- Sonrasında ana uygulama seçici kod talebe göre hangi projeye jump yapacağına karar verecek.

Eğer projelerde interrupt kullanılacak ise (normalde de gerekli olabilir emin değilim) Vector Table Relocation işlemi yapılması gerekiyor. Bunu da interrupt'ları aktif etmeden SystemInit fonksiyonunda veya main.c'nin ilk işlemi olarak aşağıdaki kodu işletebilirsiniz.


NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x..... (Burası uygulama adresi olacak))


Jump kodu için nette bulduğum örneği buraya koyuyorum.

/**
 * @brief   Actually jumps to the user application.
 * @param   void
 * @return  void
 */
void flash_jump_to_app(void)
{
  /* Function pointer to the address of the user application. */
  fnc_ptr jump_to_app;
  jump_to_app = (fnc_ptr)(*(volatile uint32_t*) (FLASH_APP_START_ADDRESS+4u));
  HAL_DeInit();
  /* Change the main stack pointer. */
  __set_MSP(*(volatile uint32_t*)FLASH_APP_START_ADDRESS);
  jump_to_app();
}

Bu tasarım yapılacak ise rom haritalandırma işinde mutlaka 32bit'in katlarına göre ayrım yaparsanız faydanıza olur.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: sımışka - 24 Ocak 2020, 10:25:50
Her iki programın koşacağı bellek bölgelerini linker ile ayarlaman gerekiyor. Sırasıyla bir jump fonksiyonu ile vektor tablosunu, stack ve program counterı güncellemen gerekiyor. Bu iş için bootloadera gerek yok fakat , mainleri güncellemek gerekeceği ve bootloader ile güncellemek istiyorsan gerekli. Bu iş için ufak bir program yazıp , sabit olarak belleğe gömüp başlangıçta bu yazılım ile ayağa kaldırırsan (asm düzeyinde bir kod ile kısıtlı ilklendirme yaparak), hangi maine geçiş yapacağına bu yazılım ile karar verebilirsin.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 24 Ocak 2020, 13:17:51
Alıntı yapılan: MrDarK - 24 Ocak 2020, 10:16:18- İki ayrı uygulama denince iki ayrı proje deniyor ise her projeyi ayrı ayrı oluşturacaksınız.
- Her uygulama için ROM alanını hesalayıp haritalandıracaksınız. Örn 0 - 0x100 arası 1.uygulama, 0x100 - 0x200 arası 2. uygulama gibi
- Sonrasında her projenin .ld (attolic/gcc için) uzantılı dosyasını açıp yukarıda belirttiğim rom alanlarını güncelleyeceksiniz.

Herkese teşekkürler.

İlk söylediğiniz ROM alanı ayırma işlemi için Keil'de options for target kısmında target ve linker sekmelerinden bu ayırma işlemini yapacağım galiba. Yani kodda ROM için bir şey yazılmayacak. Peki bu ROM boyutu ( target sekmesinde IROM1 0x800000-0x20000 yazıyor.) neye göre belirleniyor. İkinci projeye ben de 0x8020001-0x20000 yazabilir miyim? (Burada 0x80.. start, 0x20000 ise size oluyor.) 

Alıntı yapılan: MrDarK - 24 Ocak 2020, 10:16:18- Sonrasında her projenin .ld (attolic/gcc için) uzantılı dosyasını açıp yukarıda belirttiğim rom alanlarını güncelleyeceksiniz.
- Sonrasında ana uygulama seçici kod talebe göre hangi projeye jump yapacağına karar verecek.

Burada bahsettiğiniz .ld dosyası asssembly dosaysı mı oluyor. Keil'da farklı uzantıya sahip. Bu rom alalarını yazdıktan sonra en son birinci projeme jump fonksiyonumu ekleyeceğim ve MCU'ya kodu yükleyeceğim. Daha sonra ikinci projeyi açıp onu da MCU'ya yükleyeceğim. Bu şekilde bir buton yardımıyla istediğim projeyi seçebilir miyim?

Yardımlarınız için teşekkürler. Daha önce böyle bir şey hiç yapmadığım için kafam karışık ve internette bu jump fonksiyonunu yazanları gördüm ama her şeyi nasıl yaptığını anlatan birini göremedim. Meşgul ediyorum sizi de kusura bakmayın. 

Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: e-zeki - 24 Ocak 2020, 14:41:21
Öncelikle kullandığın mcu'nun refference manuel'inden o işlemcinin flash memeory yapısına bakman gerekiyor flash page mi sector mu ona göre bir adres belirlemelisin. sector yapısında olan mcu'larda sector boyutları birbirinden farklı ve yazma silme işlemi esnasında tüm sektörü tek kabul eder. sen 2 hex dosyasını aynı sektörde bulunan adres aralığına yazarsan 2. hexi yüklerken her zaman 1. hexi de siler.
Alıntı yapılan: mr.engineer - 24 Ocak 2020, 13:17:51Peki bu ROM boyutu ( target sekmesinde IROM1 0x800000-0x20000 yazıyor.) neye göre belirleniyor. İkinci projeye ben de 0x8020001-0x20000 yazabilir miyim? (Burada 0x80.. start, 0x20000 ise size oluyor.) 
Bu kısım senin kullandığım mcu'nun ROM boyutu ve başlangıç adresini belirtir. zaten orada da start - size olarak görünür. Projelerinin boyutlarına göre size belirlemelisin ve page / sektör durumuna göre de start adress belirlemelisin.
Bundan sonra jump fonksiyonundan önce 2. hexin (Memory'de 0x08000000'den başka bir adrese yazılacak olan) için vector table'ın adresini değiştirmen gerekiyor.
bu da  #define VECT_TAB_OFFSET şeklinde dosyanın birinde tanımlı.
Buraya kadar geldikten sonra jump fonksiyon kısmına geçebilirsin.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: z - 25 Ocak 2020, 04:55:13
Bu iki C projesi icin gecis islemlerini startup dosyasinda halletmekte ayrica fayda var.

Soyleki;

Reset islemi ardindan stack tanimi, stack pointerlerin alacagi degerler, startup islemleri ve C icin init islemleri (global degiskenlere ilk deger atama vs) main fonksiyonu calismadan once yapilir.

Bir C projesi calistiktan sonra diger C projesine gecilecekse tum bu init islemlerinin yeniden yapilmasi, bas agrimamasi icin onemlidir.

Bu tur mudahaleler icin en iyi yer de startup kodlari olacaktir. Fakat bu kisma asm yazmaktan baska yol var mi bilmiyorum.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 28 Ocak 2020, 17:27:00
Alıntı yapılan: e-zeki - 24 Ocak 2020, 14:41:21Öncelikle kullandığın mcu'nun refference manuel'inden o işlemcinin flash memeory yapısına bakman gerekiyor flash page mi sector mu ona göre bir adres belirlemelisin. sector yapısında olan mcu'larda sector boyutları birbirinden farklı ve yazma silme işlemi esnasında tüm sektörü tek kabul eder. sen 2 hex dosyasını aynı sektörde bulunan adres aralığına yazarsan 2. hexi yüklerken her zaman 1. hexi de siler.Bu kısım senin kullandığım mcu'nun ROM boyutu ve başlangıç adresini belirtir. zaten orada da start - size olarak görünür. Projelerinin boyutlarına göre size belirlemelisin ve page / sektör durumuna göre de start adress belirlemelisin.
Bundan sonra jump fonksiyonundan önce 2. hexin (Memory'de 0x08000000'den başka bir adrese yazılacak olan) için vector table'ın adresini değiştirmen gerekiyor.
bu da  #define VECT_TAB_OFFSET şeklinde dosyanın birinde tanımlı.
Buraya kadar geldikten sonra jump fonksiyon kısmına geçebilirsin.

Yardımlarınız için teşekkürler. Birkaç gündür bakamamıştım bugün dediklerinizi yapmaya çalışıyorum.

Vector table offset kısmında takıldım. Derleyici de VTOR registerının tanımlı olmadığını gördüm. Daha sonra cortex M0 da VTOR registerının bulunmadığını öğrendim yani vector table her zaman 0x00000 adresindeymiş. Bu durumda ne yapmam gerekiyor?

Bir diğer anlamadığım yer vector table 0x0000 adresinde mi olur yoksa 0x08000 (flash memory başlangıç adresi) adresinde mi?

Benim anladığım kadarıyla Vector table 0x08000 adresinde bulunuyor ve istersek  0x0000 adresinden de ulaşabiliyoruz. (aliasing) Memory mapin en altında flash, system memory, SRAM boot configuration yazıyor.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: HAKKITANIR - 28 Ocak 2020, 20:45:34
Doğrumu anlamışım?
işlemci ilk çalışmasına başladı ve int main(void) içerisi işletilip, tüm ayarlamalar yapılıp,
While(1) içerine girildi.
Bu aşamadan sonra şu yapılmak isteniyor;
herhangibir şart gerçekleştiğinde, işlemcinin çalışması durdurulmadan,
tıpkı yukarıda ilk açılışta işletilen, int main(void) fonksiyonu gibi, ama daha farklı özelliklerdeki ve farklı ayarlamalardaki, ikinci bir int main(void) fonksiyuna veya adı başkada olabilir, atlanılacak ve bu fonksiyon işletilip tekrar, While(1) içerisinde kalınan yere dönülüp program buradan çalışmasına devam edecek.
iki main içinde tek bir while var galiba, anladığım kadarıyla.

Bence bu olur, ama ikinci main fonksiyonun adı farklı olup, adı bizim tanımlayacağımız bir şey olur,
ve while(1) içerisinde gerekli şartlar oluşana kadar bekler. yani bu ikinci main işlevini yapacak fonksiyon,
while(1) içerisinde olmalı.
Bootlooderi bilmem ama, Yanlış değilsem programda jump label tarzı işlemlerle while(1) içerisine girdikten sonra, while(1) dışına atlanılamıyordur diye düşünüyorum.
Atlanılabiliyorsa sizin iş zaten olmuş bitmiş görünüyor.
Atlanılamıyorsa bir kaç satır üst de, dediğim gibi bir işlem yapılsa işiniz  görülmez mi?

yalnız her iki durumdada mesela devam eden bir pwm çıkış döngünüz, devam eden bir dac çıkışı, Ic girişi, ayarlanan bir timer çalışması veya seri haberleşme tarzında bir yapı varsa, kısaca çalışan işlemci modüllerinin kontrol registerlerine, port konfigürasyonlarına,
yeniden dokunduğunuz anda ortalık karışabilir. bu kısımlarıda göze almak ve önlem almak gerekebilir.
veri kaybı ve çalışmaların sekteye uğrayacağı kesin, sonuç da ikinci bir main gibi bir şey oluşturacaksınız.
modüllerin yedeği yok bunlar iki main içinde aynı ve ortak olacaklar.

bu kısımları belirtenler olmuş üstde ki mesajlarda.

ben ikinci bir main fonksiyonunun çalışma zamanında kesinlikle gerekip gerekmediği noktasında tereddütte kaldım.
yapılacakta kesin gereklmi dir böyle bir şey, olmazsa olmazmı dır yani?
başka çözüm yöntemleriyle iş görülemez mi noktasında şüpheciyim.
SpeedyX in dediği gibi bir şey olurmu olmazmı bunu bilemiyorum ama,
program illa int main(void) fonksiyonunu işletmek zorunda olmalı diye biliyorum.
ne olursa olsun bu işletilip while(1) içerisine girilmek zorunda kalınacaktır sanıyorum.

bir deneyebilirmisiniz derleyiciniz while(1) içerisinden, while(1) dışına yani int main(void) içinde bir yere dallanabiliyor mu?
dallanmıyordur herhalde.
yada bir kesme fonksiyonu içine dallanabiliyormu diyecem ama, bu zaten gereksiz olur herhalde.
kolay gelsin. 
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 28 Ocak 2020, 21:11:12
Amacım yukarıda anlatıldığı gibi iki farklı proje (iki farklı keil projesi) oluşturup ikisini de mikrodenetleyiciye gömmekti. İstediğim zaman birinden diğerine geçeceğim. Dedikleri gibi ROM'u ikiye bölüp her birine bir proje atmak istiyorum. Fakat bir türlü yapamadım.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: HAKKITANIR - 28 Ocak 2020, 23:55:19
Alıntı yapılan: mr.engineer - 28 Ocak 2020, 21:11:12Amacım yukarıda anlatıldığı gibi iki farklı proje (iki farklı keil projesi) oluşturup ikisini de mikrodenetleyiciye gömmekti. İstediğim zaman birinden diğerine geçeceğim. Dedikleri gibi ROM'u ikiye bölüp her birine bir proje atmak istiyorum. Fakat bir türlü yapamadım.

yapmaya çalıştığınızın kesin yapılabildiğini bunun mümkün olduğunu söylüyorsunuz anladığım kadarıyla.

bence tek yazılımla bir şekilde olur diye düşünüyorum bu iş. bir programdan komple diğer programa geçilmesindense,
aynı programda farklı özelliklerde çalışma şekli, seçimlik şartları oluştuğunda uygulanabilir diye düşünmüştüm.
umarım yaparsınız istediğinizi bizde olabiliyormuş diye not düşeriz bir yere,
belki bize de lazım olur böyle bir çalışma ileride. sonucu bildirirseniz sevinirim. bizimde bilgimiz olmuş olur.

size iyi çalışmalar dilerim. 
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 29 Ocak 2020, 10:32:27
Merhabalar herkese, başlıkta belirtilen konu üzerinde bazı kısımları açıklığa kavuşturmak için bir paylaşım yapmak istiyorum. Hatalı gördüğünüz kısımları belirtirseniz sevinirim.

Şu şekilde bir gidişat yapacağız, 2 farklı projeyi demo bir karta yükleyerek birbiri arasında bir geçiş yapacağız.

Kullandığım kart :NUCLEO-F401RE

Öncelikle kullandığınız işlemcinin "Reference Manual" dosyasını internet üzerinden bulalım. Bu dosyayı bulduktan sonra, "Embedded Flash memory in STM32F401xB/C and STM32F401xD/E" başlığına gidiyoruz.

Burada flash hafızamızın layoutunu görebiliriz ve uygulamaları koyacağımız sektör adreslerini görmekteyiz.

Uygulamada Sector 0'da bir uygulama, Sector 1'de ise diğer uygulamayı barındıracağım ve aralarında geçiş yapacağım.

Öncelikle gelin Sector 0'a yapacağımız uygulamayı hazırlayalım. Öncelikle Sector 1'e atlamak için bir fonksiyon yazalım.

static void JumpFunctionSectorOne(void)
{
typedef void (*Jump)(void);
Jump JumpFunc;
uint32_t JumpAddr = *(uint32_t *)(0x08004000 + 4);
JumpFunc = (Jump)JumpAddr;
__set_MSP(*(__IO uint32_t*)0x08004000);
JumpFunc();
}

Burada *(uint32_t *)(0x08004000 + 4) 4 ofset vermemizin sebebi zıplayacağımız yerde bulunan vector tablosunda (startup_stm32f4xx dosyasında bulabilirsiniz.). Reset Handler ikinci sırada bulunan bir fonksiyon göstericisi ve word cinsinden adreslendiği için + 4 eklemekteyiz.

Aynı şekilde main stack pointer'i set etmeyi unutmayın, daha sonrasında tanımsız davranışlar yaşamamak için.

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler

Kodu derleyip yüklerken eğer defaultta bulunan sector adresinden başka bir yere yükleme yaparsanız, hem kodun barınacağı adresi hem de vector tablosunun yer alacağı adresi değiştirmeniz gerekmekte. Aksi takdirde jump ettğiniz yerde çakılır uygulamanız, bu oldukça kritik. Biz bu uygulamayı sector 0 yani default alanda barındaracağımız için herhangi bir değişiklik yapmayacağız şu anda. Fakat sector 1 içerisinde çalışacak uygulama için bu değişiklikleri az sonra yapacağız.

Main içerisinde önce uygulamanın başladığını ve bir süre sonra jump edeceğini söylüyoruz.

printf("Cihaz ayakta, Cihaz 0.sektorden basladi");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
printf("\r\n Uygulama Jump Edecek \r\n");
HAL_Delay(3000);
JumpFunctionSectorOne();
printf("\r\n Kod buraya ulasmadi \r\n");

    /* USER CODE BEGIN 3 */
  }

Şimdi ise, yazacağımı kodu Sector 1'e koyalım ve Sector 0'a jump yapmasını sağlayalım. Yani bir önce bahsettiğimiz uygulamanın tam tersi. Öncelikle rom adresini değiştirmemiz gerekmekte.
Eğer keil kullanıyorsanız, Option For Target kısmında bulunan IROM1 kısmından bu adresi değişterebilirsiniz. Uygulamayı Sector 1 içerisinde barındaracağım için, reference manual üzerinden oranın adresini aldım ve 0x8004000 şeklinde IROM1 kutucuğunu düzenledim. Tabi bu kadarı yeterli mi? Hayır. Şimdi ise vector tablomuzu düzenlememiz gerekmekte. Bunun için, system_stm32f4xx.c içerisine gidelim

#define VECT_TAB_OFFSET  0x8004000 /*!< Vector Table base offset field.
                                   This value must be a multiple of 0x200. */

Yukarda görmüş olduğunu kısım ilk uygulamamız da 0x00 olarak tanımlıydı fakat şimdi farklı bir sector de barındırdığımız kodu çalıştıracağımız için buraya offset veriyoruz.

Sıra geldi Sector 0'a zıplamak için yapmamız gerekenlere, bunun için şöyle bir fonksiyon yazalım, ilk uygulamaya benzer şekilde.

static void JumpFunctionSectorZero(void)
{
typedef void (*Jump)(void);
Jump JumpFunc;
uint32_t JumpAddr = *(uint32_t *)(0x08000000 + 4);
JumpFunc = (Jump)JumpAddr;
__set_MSP(*(__IO uint32_t*)0x08000000);
JumpFunc();
}


Şimdi ise main içerisinde uygulamanın sector 1den başladığını ve jump edeceğini belirtelim.

printf("Cihaz ayakta, Cihaz 1.sektorden basladi");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
printf("\r\n Uygulama Jump Edecek \r\n");
HAL_Delay(3000);
JumpFunctionSectorZero();
printf("\r\n Kod buraya ulasmadi \r\n");

    /* USER CODE BEGIN 3 */
  }

Şimdi bu kodu da kartımıza yükleyelim, yalnız karta yüklerken flashı temizlemeyin, çünkü sector 0'a yüklemiş olduğumuz bir yazılım var. Eğer temizlerseniz uygulama çalıştıktan bir sonra sector 0'a zıplayacak ve FF olduğu için hardfault'a düşeceksiniz.

İşte bu kadar, iki farklı uygulamayı bu şekilde tek bir kart işlemcide çalıştırabilir ve arasında geçiş yapabilirsiniz.

Eğer üretim kodunuzda böyle yapı barındaracaksınız bazı korumaları almanızda fayda var, başka bir sektöre geçiş yapmadan önce o sektörde bir yazılım olup olmadığını kontrol etmek gibi.



Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: HAKKITANIR - 29 Ocak 2020, 11:03:58
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 29 Ocak 2020, 11:09:58
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

Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: HAKKITANIR - 29 Ocak 2020, 11:24:32
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 29 Ocak 2020, 11:27:53
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.

Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 31 Ocak 2020, 01:41:07
Herkese yardımları için teşekkür ediyorum. Hallettim.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 31 Ocak 2020, 08:24:05
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: HAKKITANIR - 31 Ocak 2020, 15:08:07
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 05 Şubat 2020, 21:31:30
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 03 Mayıs 2020, 19:48:58
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ı?
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 03 Mayıs 2020, 22:30:56
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
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: MrDarK - 03 Mayıs 2020, 23:09:41
Konu Attolic keil veya iar la alakası yok. Tamamen arm mimarisine göre mcu yu init edip yönlendirmek. Kodları görelim :)
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 03 Mayıs 2020, 23:17:27
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 04 Mayıs 2020, 01:33:22
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.


Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: muhendisbey - 04 Mayıs 2020, 02:01:54
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.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 04 Mayıs 2020, 02:22:04
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ı.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: volkanunal - 04 Mayıs 2020, 11:58:27
Şurayı bir inceleyebilir misiniz, derleme yaptığınız ortamda yapılması gerekenleri yaptığınızdan emin olamadım. Keil ortamında çalışmıştım.

https://engineeringvolkan.wordpress.com/2020/01/31/iki-main-tek-islemci/
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 04 Mayıs 2020, 13:39:53
Bunları uyguladığımı düşünüyorum. Aslında ilk bootloader tecrübem değil ilk defa bu kadar uzun sürdü bu kısım. F103 ile deniyordum bir de F4xx lerle deneyeyim.
Elimdeki işlemci çin klonu olup başka bir davranış mı sergiliyor diye düşünmeye başladım.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: mr.engineer - 04 Mayıs 2020, 16:16:57
Merhaba hocam ben de Cortex-M0 ile yaptım bu projeyi. Şu an sıkıntı çektiğiniz yer neresidir tam olarak? Jump fonksiyonu doğru çalışıyor mu?
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 04 Mayıs 2020, 16:46:10
Hocam disassambler ile kontrol ettik compiler saçmalıyor. Optimizasyon size olarak gelmiş varsayılan olarak. Onu kapatınca jump birşey değiştirmeden çözüldü. Ama bu sefer re init yapmıyor. Aslında tam anlamıyla çalışmadı. Onu anlamaya çalışıyorum.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 04 Mayıs 2020, 22:58:52
Belki karşılaşılan olursa diye paylaşıyorum. IDE değişince sorun kalmadı. ST yeni ide yayınlamış STCubeIDE onu kullandım. CubeMX içine entegre edilmiş.
Test için 0x8000 sonrasına ve başa iki farklı uygulama yazıp bir ona bir ona zıplayabiliyor uygulama şuanda.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: muhendisbey - 05 Mayıs 2020, 00:53:07
Casio'nun hesap makinelerindeki asic içerisinde bir adet eeprom bulunur. İçerisinde 3-4 makinenin kodu bulunur bu makinelerde. Fabrikada bu hesap makineleri ilk açıldığında rom sayısı sorar. Bu numaralar uygun kasaya göre girildiğinde artık olay biter. Eeprom içerisine donanımsal reset olmadan (ki bu fark edilince artık donanımsal olarak da artık bu konulmuyor) tekrar eeproma girilemiyor.

Eskiden videosu vardı silinmiş ama yöntem burada anlatılmış:
https://trybotics.com/project/Upgrade-your-Casio-fx-82es-into-115es991es570es-84207

Benzer durumu mcu'da kullanmak yerine bu şekilde iki main fonksiyonlu yapmanın artısı/eksisi nedir? Mesajları okudum ama anlayamadım. Maksat sadece birinin pin durumuna ya da yazılıma göre çalışması olarak anladım, multithread değil gibi.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: kralsam - 05 Mayıs 2020, 01:06:07
O dediğin mümkün hocam da onun için iki app e gerek yok. Konfigürasyon seçimi olayı onda yeterli. Aslında bu konu multicore mcu larda da benzer şekilde kullanılıyor. Birinci core başlangıç ayarlamalarını yapıp ilgili adresleri pointerlere bağlayıp bırakıyorsun.

Buradaki konu servis menüsü için kullanılabilir vs. Aslında tercih. Nasıl yapmak istersen.
Başlık: Ynt: STM32 iki main fonksiyonu
Gönderen: muhendisbey - 05 Mayıs 2020, 01:13:54
Alıntı yapılan: kralsam - 05 Mayıs 2020, 01:06:07O dediğin mümkün hocam da onun için iki app e gerek yok. Konfigürasyon seçimi olayı onda yeterli. Aslında bu konu multicore mcu larda da benzer şekilde kullanılıyor. Birinci core başlangıç ayarlamalarını yapıp ilgili adresleri pointerlere bağlayıp bırakıyorsun.

Buradaki konu servis menüsü için kullanılabilir vs. Aslında tercih. Nasıl yapmak istersen.
Kafa eski olunca çok çekirdekli mcu kavramını düşünemedim. Haklısınız çok çekirdekli mcu'da gereklilik bile sayılabilir. Teşekkürler.