Bir Garip Debug Durumu Union ve Parçaları

Başlatan e-zeki, 04 Ocak 2021, 18:32:36

e-zeki

Merhabalar. bir stm32F4 ve bir stm32F0 MCU ile proje geliştiriyorum. daha önce sıkça kullandığım bir şekilde union tanımladım CAN BUS üzerinden haberleşecekler.
fakat şöyle bir durum açığa çıktı
F4 tarafında union sorunsuz çalışmakta, tüm parçalara erşip değiştirebiliyorum. debugda da gözleyebiliyorum değişikliği
FAKAT:
F0 tarafında uint32_t olmayan parçalar (bit sınırlaması yaptıklarım)değiştirilemez halde kalıyor, elle yazdığımda kod tepki vermiyor. memcpy memset ile yaparsam ya da kod içinde değiştiryorsam değer değişiyor fakat elle müdahale ettirmiyor. Üstelik 0 olarak görünüyor her zaman. Örneğin Tester.a 15 bit olduğu için 0 görünürken b ve c sorunsuz şekilde hem gösteriyor hem değiştirilebiliyor.
 F4 debug da sıkıntısız müdahale edebiliyorken F0'da edemememin özel bir sebebi var mıdır?

Union:
#pragma pack(push,1)
typedef struct{
  
struct{
    
uint8_t DLC:4;
    
uint8_t RTR:2;
  }
Frame;
  
  
union{
    
uint32_t ID;
    
struct{
    
uint32_t node:7;
    
uint32_t COB:4;
    
uint32_t :21
    }
stdID;
  }
CanID;
  
union{
    
uint8_t whole[8];
    
struct{
      
uint32_t s:1;
      
uint32_t e:1
      
uint32_t n:2
      
uint32_t :1;
      
uint32_t ccs:3;
      
uint32_t index:16;
      
uint32_t subIndex:8;
      
uint32_t variable;
    }
Parts;
    
struct{
      
uint16_t a:15;
      
uint16_t:1;
      
uint16_t b;
      
uint32_t c;
    }
Tester;
  }
Data;
CAN_PackTypeDef;
#pragma pack(pop)
Bu da debug ekranı:


Tagli

Değerleri kod içinden mi atamaya çalışıyorsun yoksa debugging sırasında IDE üzerinden mi?

Konuyla doğrudan ilgili olmayabilir ama ilk deneyeceğim şey strict aliasing optimizasyonunu kapatmak olurdu. CubeIDE'de optimizayon ayarlarıda çıkıyor. GCC için -fno-strict-aliasing bayrağı da kullanılabiliyor. Ben zaten hep kapalı tutarım bunu.

F0 ve F4 arasında ilk aklıma gelen fark unaligned access destekleyip desteklememeleri. Gerçi F0 için GCC bunu göz önünde bulundurarak kod üretiyor struct ve union'lar için. Hem zaten bunu ihlal edersen doğrudan hard fault alırsın, yani debug sırasında kendini belli eder. Ama acaba debug session üzerinde atama yapmaya çalıştığında, derleyicinin yapabildiğini debugger yapamıyor olabilir mi? İlk paragraftaki soruyu o yüzden sormuştum.
Gökçe Tağlıoğlu

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.