LPC23xx kod koruma sorunu

Başlatan mezire, 29 Temmuz 2009, 18:48:27

mezire

merhaba...

lpc2368 işlemcisini kod koruma ile yazdığımızda işlemci çalışmıyor. sorun neden olabilir.

bir ara keilde yazdığımız kodlardan kaynaklanıyordu ama şimdi onu düzeltiyorum ama yine devre çalışmıyor.

kod korumalı yazmadığımızda devre çok güzel çalışıyor.


acaba keil ayarlarında mı bir sorun var.

EOS

Flashmagic programını kullanıyorsan ,,,ver 5.xx  sonra kod koruma menüden kaldırdılar,,bunu yerine yazdığınız program içine 0x1fc...0x1ff adres aralığına 0x87654321 kodunu ekleyin diye mesaj yazmışlar.
Ama maalesef bu yöntemde kod koruma oluyor ama program çalışmıyor.
Bi terslik var. tekrar 4.64 versiyonu kullanmaya başladık.

Version 5.11
------------

- Added support for start954.a51 from Keil to program all security bits from a hex file.

- LPC17xx/LPC2xxx code read protection settings now come only from the hex file locations 1FCH - 1FFH.

- Fixed bug regarding verify for LPC17xx.



http://forum.flashmagictool.com/index.php?topic=3620.0

controller

#include <absacc.h>

const unsigned long CodeProtect __at (0x1FC) = 0x87654321;
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

ahmet2004

*mezire*

Kangi kiti kullanıyorsun?

Birde CRP3 kod korumasına aldığımızda geri dönüş yok galiba.

mezire

kendi yaptığım test devresini kullanıyorum.  önceden kit olarak ETT  marka ARM7 mic. cont. kiti kullanıyordum . 80$ civarıdaydı sanırım.  

kod koruma yaparken flash magic ile yapıyorum. seri porttan bağlantı kuruyorum.   kod korumalı yazdırıp tekrar silebiliyorum.

ama "CRP3" derken neyi kastediyorsun anlıyamadım. "CRP3" program içinde bir kod ise yazılım tarafını ben yazmıyorum. arkadaşım yazıyor. belki o cevap verebilir.

mezire

Aşağıdaki satırlardan birini kullanabilirsiniz.
CRP3 olanını kullanırsanız bir daha yazma yapamazsınız.
O yüzden ar-ge ve test çalışmalarınızda kesinlikle CRP3 kullanmamanızı tavsiye ederim.

const unsigned long crp __attribute__ ((at(0x1FC))) = 0x12345678; // CRP 1
const unsigned long crp __attribute__ ((at(0x1FC))) = 0x87654321; // CRP 2
const unsigned long crp __attribute__ ((at(0x1FC))) = 0x43218765; // CRP 3
const unsigned long crp __attribute__ ((at(0x1FC))) = 0x00; // CRP disabled

EOS`un bahsettiği kilitlenme sanırım derleme tercihi ile ilgili.
Thum modu yerine ARM modunu kullanırsan sanırım sorunun düzelecektir.
Kullandığın bazı yapılar(struct)`dan dolayı programın Thump modunda derlenince kilitlenme yapabilir.

EOS

Keil ayarlarındaki CODE GENERATION bölümü ARM seçili.Cross Module Optimization seçili.
yukarıdaki PROTECT kodu ekleyince Flashmagic okuma yaptığımda,kod koruma aktif diyor,,ama işlemci kilitleniyor.
Derlem ayarlarındaki seçenekleri değiştirerek dendim ama sonuş değişmedi.
Bu arada işlemci LPC2148 ve CPP programlama yapıyoruz....

ahmet2004

*EOS*

Kod korumada kilitlenme olmuyor en azından denediğim kodlarda.

Yeni Flashmagic.v5.27 ilede kodlardan bazılarını derleyip attım bir sorun göremedim.

Başka bir demo kod ile kod koruma yapmayı denedinmi?

Yine kilitlenmeler oluyormu?

Veya buraya kodun bir kısmını ekleyebilirsen beraber bakalım.

EOS

const unsigned long CodeProtect __at (0x1FC) = 0x87654321;


yukarıdaki satırın yazılacağı yer önemlimi.Biz programın başında #include satırlarından sonra yazıyoruz,gerçi ilk satıra yazarakda denedik ama.

controller

Alıntı yapılan: "EOS"
const unsigned long CodeProtect __at (0x1FC) = 0x87654321;


yukarıdaki satırın yazılacağı yer önemlimi.Biz programın başında #include satırlarından sonra yazıyoruz,gerçi ilk satıra yazarakda denedik ama.

Yukarıdaki satırı #include satırları ile main arasında herhangi bir yere yazabilirsiniz. Ancak yukarıdaki satırı kodunuza ekleyinde FlashMagic den tekrar codeprotect seçmenize gerek yok. Ben bu kodu LPC2148 ve LPC2368 ile test ettim, herhangi bir problem olmadı.

Bu kodu eklmeden sadece FlashMagic den codeprotect seçince kilitlenmesinin sebebi, FlashMagic'in yükleyeceğiniz hex dosyasında 0x1FC adresindeki veriyi 0x87654321 ile değiştirmesinden kaynaklanmaktadır. Buda çalışma anında işlemci bu adrese geldiğinde pogram akışının değişmesine sebep olmaktadır. Bunu önlemek için yukarıda verdiğim kod ile 0x1FC adresi rezerve edilir ve derleyici tarafından bu adrese herhangi bir komut kodu yerleştirilmemesini sağlar. Rezerve edilen bu adrese de 0x87654321 verisi atanarak derleme anında kod koruma özelliği aktif edilmiş olur.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

EOS

Alıntı yapılan: "controller"
#include <absacc.h>

const unsigned long CodeProtect __at (0x1FC) = 0x87654321;


evet yukarıdaki kodları aynen uyguladık,, ama sonuç değişmedi.
dissamblerde incelediğimde aşağıdaki kodlar yazılmış.
0x1fc :4321
0x1fe :8765

ve bu adreslerin öncesinde ve sonrasında printf fonksiyonun kodları var.
pogramda printf kullandığımız için burda kilitlenme oluyor.
programda sadece yukarıdaki satırları kaldırdığımızda (const unsigned......) cihaz problemsiz çalışıyor.
Heüz aşamadık bu problemi.

EOS

Programda sprintf kullanmadığımız zaman code protect işleminde problem olmuyor.Herşey normal.

code protect yaptığımızda (const unsigned .....   satırı) Flashmagic 'de READ sECURITY yaptığımızda "CRP 2 or 3" yazıyor
code protect satırı kaldırdığımızda  "CRP DISABLED" yazıyor.

Sonuç olarak sprintf fonksiyonun kodları 0x1fc....0x1ff adreslerine denk geldiği için program kilitleniyor.(tabii,derleyici  bu adreslere başka fonksiyonun kodlarını da koyabilirdi....)

henüz çözemedik bu sorunu......

z

Bu adresi kendine reserve etmeyi denesene.

Mesela 160H den 180H e kadar olan alana asm nop koy. Benzer sorun benim de basima gelebilirdi bahsettigim cozume benzer bir cozumle bu alani reserve ettim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ahmet2004

Keil uVision4 de yazacağınız kod:

const unsigned long crp __attribute__ ((at(0x1FC))) = 0x87654321; // CRP 2


Kod korumasız:


Kod korumalı:



FlashMagic kullanıyorsanız şu satırı kullan rezerve etsin sıfırla doldursun 0x1fc yi:
const unsigned long crp __attribute__ ((at(0x1FC))) = 0x00; // CRP disabled


Siz hangi derleyiciyi kullanıyorsunuz?

Bende bir sorun yok.

mezire

Aşağıdaki satırları main fonksiyonun bulunduğu ana dosyanın en başına ekleyin.
#include ile herhangi bir kütüphane dosyası eklemeden önce, yani tüm başlık dosyalarından da önce bu kodları kullanın.
Ben "READ_SECURITY_CRP_2();" seçeneğini kullandım.
Eğer, CRP3 olanını kullanırsanız işlemcinizi bir daha kullanamazsınız.

Dikkat ederseniz aşağıdaki örnekte READ_SECURITY_CRP_2(); satırını ve diğer makroları programın ilk satırları olarak kullanıyoruz.
Bu şekilde kullanırsanız, kod korumanın olduğu adrese herhangi bir fonksiyon ya da değişkenin gelmesini engellemiş olursunuz.


Örnek Kullanım;
---------------------------

/* Kod koruma macroları */
#define READ_SECURITY_CRP_Disable() const unsigned long crp __attribute__ ((at(0x1FC))) = 0x00; // CRP disabled
#define READ_SECURITY_CRP_1()       const unsigned long crp __attribute__ ((at(0x1FC))) = 0x12345678; // CRP 1
#define READ_SECURITY_CRP_2()       const unsigned long crp __attribute__ ((at(0x1FC))) = 0x87654321; // CRP 2
#define READ_SECURITY_CRP_3()       const unsigned long crp __attribute__ ((at(0x1FC))) = 0x43218765; // CRP 3

READ_SECURITY_CRP_2();  // CRP2 seviyesini kullanarak kodumuzu tam burada koruyoruz.

#include "string.h"
#include "MyLib.h"

int main(void)
{
   while (1)
   {
   }
}