PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : Embedded Data base



m_online3710
09-03-2014, 10:18
سلام دوستان.
میخواستم ب÷رسم تا به حال دیتا بیسی برای میکروکنترلرهای که قابلیت نصب سیستم عامل(آندرویدو لینوکس و ...) ندارند تولید شده.
یه چیزایی سرچ کردم مثل همستر و sqlLite اما مشخص نکرده برای میکرومنترلرهای مانند lpc1768 هم قابل استفاده هست یا نه.
ممنون میشم راهنماییم کنید.
میخوام ببینم اگر روش کار نشده انجامش بدم

m_online3710
11-03-2014, 10:39
شاید بیشتر توضیح بدم بهتره
ببنید وقتی ما می خواهیم با MMC/SD یا فلش مموری ها کار کنیم الزاما با فایلها سر و کار داریم(اگر از ساختار fat استفاده کنیم که عاقلانهست استفاده کنیم). حال زمانی هست که میخواهیم یکری اطلاعات رو توی یه فایل ذخیره و بازیابی کنیم. در اینجا چون اطلاعات مهم هستند یعنی در واقع فایل مورد نظر دیتا بیس ما هست بهتره یک نرم افزار امن این کار رو انجام بده چون کاربر احتمال داره با یک اشتباه در قسمتی از برنامه کلا دیتا بیس رو پاک کنمه یا اطلاعات را به هم بریزه(البته نرم افزار دیتا بیس قابلیتهایی مثل جستجوی خیلی سریع هم از طریق شاخص گذاری فراهم میکنه). این کار رو در کامپیوتر نرم افزار هایی مثل SQL یا ORACEL انجام میده حالا میخوام بدونم برنامه برای میکروکنترلرهایی که قابلیت نصب سیستم عامل های رایج مثل آندروی یا windowCE رو ندارد مثل همین میکروکنترلرهای با هسته ARM7 یا cortexM3 وجود داره یا نه. من هرچی خودم گشتم دقیقا گفته نشده بود برنامه های موجود(همستر و sqlLite و ...) می تونند رو این میکرونترلرها هم کار کنند یا نه. حالااگر دوستان برنامه ایی میشناسند معرفی کنند ممنون میشم. قصد طراحی همچین چیزی رو دارم اما نمی خوام راه رفته رو دوباره برم.

m_online3710
16-03-2014, 10:10
یعنی خدایی اینقدر مبحث سنگینه!!!

shahin
16-03-2014, 13:56
مبحث سنگین نیست ولی بعید میدونم کسی روی این میکرو تا حالا از این کارا کرده باشه! sqlite رو تقریبا تو هر محیطی میشه برد ولی به نظر من برای این میکرو باز هم سنگین هست! بازده سیستم اونقدر پایین میاد که کار های دیگه رو ممکنه مختل کنه!
نمیدونم ماهیت داده های شما چیه ولی منطقی تر هست از قالب های ساده تر مثل csv استفاده کنید که هم راحت تر هست و هم سریع تر!
You can see links before reply

m_online3710
18-03-2014, 16:59
ممنوناز پاسختون. ماهیت داده ها که هر چیزی می تونه باشه هر نوع آبجکتی یا هر نوع از انواع اولیه.
با محاسباتی که کردم فکر نمیکنم انقدرم بخواد سنگین باشه حالا نمیدونم sqllite مگه کار خواستی انجام میده. من از همه ساختارهای پیشرفته مثل درخت B+ و یا درهم سازی هم میخوام استفاده کنم که بیس دیتابیس هایی مثل ORACEL و SQL هست
من تو فکرشم بنویسمش فقط نمیخواستم کار تکراری کنم

shahin
18-03-2014, 18:16
هیج کاری هم نکنه باید بتونه یه کوئری کامل رو پارس کنه دیگه!
اگر دوست دارید این کار رو پیاده کنید توصیه میکنم همین sqlite رو کامپایل کنید. چون ربطی به نوع سیستم عامل نداره نباید موردی باشه. سورسش:
You can see links before reply
راهنمای کامپایل:
You can see links before reply
داشتم میگشتم راجع به این قضیه یکی تو stackoverflow یه مورد دیگه رو معرفی کرده بود به اسم GDBM . من باهاش کار نکردم ولی به نطر فقط به صورت key/value دیتا رو ذخیره میکنه و از sqlite سبکتر هست:
You can see links before reply

m_online3710
05-04-2014, 10:35
سلام
به صورت key/value یعنی چه جور؟
ممنون میشم کمی بیشتر توضیح بدی

shahin
05-04-2014, 19:15
MAP تا حالا استفاده کردید؟ key/value دقیقا همون سیستم هست.
مثلا داده ها به این صورت ذخیره شدند:


"data aval" 1
"data dovom" 2
"data akhar" 100

حالا اگه صدا کنید getValue("data dovom") به شما 2 رو بر می گردونه. جنس کلید و داده هر نوعی میتونه باشه و بر عکس ظاهر ساده که داره خیلی کاربردی هست و توی اکثر زبون ها پیاده سازی شده. مثالی که تو این لینک هست رو یه نگاه بندازید بیشتر متوجه میشید. (کد با جاوا هست ولی متوجه میشید)
You can see links before reply


اگر جاوا رو متوجه نشدید. C++ رو ببینید.
You can see links before reply

1nafar
06-04-2014, 16:20
سلام
به نظر من اجرای چنین پروژه ای با توجه به وجود تنوع در عناصر ذخیره سازی داده ( حافظه ها ) زیاد قابل توجیح نیست .
معمولا من از حافظه های زیر ذخیره کردن داده استفاده میکنم :
این قطعات به صورت استاندارد برای ذخیره سازی داده استفاده میشن و می شه گفت دیتابیس میکروکنترلر هستند :
1- حافظه های EEPRM سریال ( با پروتکل I2C مثل AT24C512)
2- حافظه های فلش سریال ( با پروتکل SPI مثل AT45DB163 )
3- حافظه های FLASH و EEPROM موازی ( مثل AT28C64 ) .
سایر حافظه ها مثل MMC یا SD یا ... برای ذخیره سازی داده های مهم پیشنهاد نمیشن و استفاده از اونا ممکنه باعث ایجاد خطا بشه ( از بین رفتن داده ، ایجاد خطا در هنگام خوندن یا نوشتن ، در دسترس نبودن ( جدا شدن توسط کاربر از میکروکنترلر ) و ... ) .
تمامی این قطعات دارای پایه ای به نام WP یا Write Protect هستند ، یا صفر یا یک شدن این پایه ، حافظه به حالت فقط خوندنی میره و به نوعی دیتابیس در برابر نوشتن محافظت میشه .
برنامه نویس میتونه با توجه به نوع داده ای که داره ، این حافظه ها رو تقسیم بندی کنه و به هر بخش ، یک نام یا شماره رو اختصاص رو بده .
مثال :
در یک پروژه که از میکروکنترلر AT91SAM7X256 به عنوان کنترل کننده اصلی استفاده شده ، کلیه داده های در یک AT24C512 ذخیره میشن ، در برنامه میکروکنترلر از توابع زیر برای خوندن و نوشتن حافظه استفاده میشه :


//-----------------------------------------------------------------------------
// reads data from a slave on the TWI bus. An optional

unsigned int Eeprom_Read(
unsigned int iaddress)
{ // Set STOP signal if only one byte is sent
unsigned char Data1,Data2;
unsigned short eedata=0;
AT91C_BASE_TWI->TWI_CR |= AT91C_TWI_STOP;
// Start read
// Set slave address and number of internal address bytes
AT91C_BASE_TWI->TWI_MMR = 0;
AT91C_BASE_TWI->TWI_MMR = (2 << 8) | AT91C_TWI_MREAD | (0x50 << 16);
// Set internal address bytes
AT91C_BASE_TWI->TWI_IADR = 0;
AT91C_BASE_TWI->TWI_IADR = iaddress;

// Send START condition
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;

// Read all bytes, setting STOP before the last byte


AT91C_BASE_TWI->TWI_CR |= AT91C_TWI_STOP;

// Wait for byte then read and store it
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY) == AT91C_TWI_RXRDY));
Data1 = AT91C_BASE_TWI->TWI_RHR;

// Wait for transfer to be complete
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP));

AT91C_BASE_TWI->TWI_IADR = iaddress+1;

// Send START condition
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;

// Read all bytes, setting STOP before the last byte


AT91C_BASE_TWI->TWI_CR |= AT91C_TWI_STOP;

// Wait for byte then read and store it
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY) == AT91C_TWI_RXRDY));
Data2 = AT91C_BASE_TWI->TWI_RHR;

// Wait for transfer to be complete
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP));

eedata=(Data2<<8)|Data1;
return eedata;
}

//------------------------------------------------------------------------------
// sends data to a slave on the TWI bus. An optional callback

unsigned char Eeprom_Write(
unsigned int iaddress,
unsigned int pData)
{

unsigned short temp2;
// Set slave address and number of internal address bytes
AT91C_BASE_TWI->TWI_MMR = 0;
AT91C_BASE_TWI->TWI_MMR = (2 << 8) | (0x50 << 16);
// Set internal address bytes
AT91C_BASE_TWI->TWI_IADR = 0;
AT91C_BASE_TWI->TWI_IADR = iaddress;
minDel();
temp2=(pData<<8);
WRITE_PROTECT=0;
minDel();
// Wait before sending the next byte
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY) == AT91C_TWI_TXRDY));
AT91C_BASE_TWI->TWI_THR = (temp2>>8);
// Wait for transfer to be complete
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP));
minDel();
minDel();
minDel();

AT91C_BASE_TWI->TWI_IADR = iaddress+1;
minDel();

// Wait before sending the next byte
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY) == AT91C_TWI_TXRDY));
AT91C_BASE_TWI->TWI_THR =(pData>>8);
// Wait for transfer to be complete
while(!((AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP));
minDel();
minDel();
minDel();
WRITE_PROTECT=0;
//– In multiple data write operation, when both THR and shift register are empty, a STOP condition is automatically
//sent and we dont need to setd stop bit .
return 0;
}

داده ها که همگی دارای طول 16 بیت هستند ( از 0 تا 65535) در دو بایت از حافظه ی EEPROM ذخیره میشن ، پس برای نوشتن داده کافیه که به صورت زیر عمل بشه :


Eeprom_Write(154,Cold_overload_I_ib_setting[1]) ;

Eeprom_Write(156,Cold_overload_I_ib_setting[2]) ;

Eeprom_Write(158,Cold_overload_I_ib_setting[3]) ;

Eeprom_Write(160,Cold_overload_I_ib_setting[4]) ;

Eeprom_Write(162,Cold_overload_I_ib_setting[5]) ;

Eeprom_Write(164,Cold_overload_I_ib_setting[6]) ;

Eeprom_Write(166,Cold_overload_I_ib_setting[7]) ;

Eeprom_Write(168,Cold_overload_I_ib_setting[8]) ;

Eeprom_Write(170,Cold_overload_I_ib_setting[9]) ;

Eeprom_Write(172,Cold_overload_I_ib_setting[10]) ;

Eeprom_Write(174,Cold_overload_I_ib_setting[11]) ;

Eeprom_Write(176,Cold_overload_Time_setting[1]) ;

Eeprom_Write(178,Cold_overload_Time_setting[2]) ;

Eeprom_Write(180,Cold_overload_Time_setting[3]) ;

و برای خوندن داده کافیه دستور زیر اجرا بشه :

VAR=Eeprom_Read(DATA_ID);

همون طور که مشاهده میکنید ، این روش که به صورت معمول در اغلب برنامه ها استفاده میشه ، همون روشی هست که اقای shahin توضیح دادن . به بیان ساده تر در میکروکنترلر به دلیل دسترسی ساده به لایه های سخت افزاری ، امکان خوندن و نوشتن داده میتونه در بالاترین سرعت و با کمترین خطا ، در صورت استفاده از قطعه ی ذخیره ساز استاندارد ( سه مورد ذکر شده ) انجام بشه ؛ در این حالت نیازی به ایجاد توابع سا سخت افزار های اضافه نیست .

esisafa
07-04-2014, 00:33
توضیحی که 1nafar عزیز دادن در سطح سخت افزار هست و برای داده های کوچک مناسب هست و بدون خطا. البته تا وقتی که به دلایلی مثلا بزرگ شدن پایگاه داده خودمون خرابش نکنیم.
شما میتونید با همین وسایل استاندار ذخیره سازی مطمئن، سطح برنامه نویسی رو بالاتر بیارید و یک کتابخونه بنویسید که بدون درگیر شدن با رجیسترها و مانند توابع cmsis امکانات اولیه ی یک دیتابیس رو فراهم کنید.
ولی پیشنهاد میکنم اول خوب فکر کنید که واقعا حاضرید تا آخرش برید و وسط راه رها نکنید چون پیچیده میشه و زمان میبره.

m_online3710
15-04-2014, 16:25
سلام
صحبت شما را در مورد اطلاعاتی در حجم کم قبول دارم اما در بعضی مواقع نیاز هست که حجم بالایی از اطلاعات را اونم با فرمتی مشخص ذخیره کنیم اون موقع هست که واقعا به چیزی مثل دیتا بیس لازم داریم چون الزاما کاربر مجبور به استفاده از sd یا nand و یا حتی شاید هارد و فلش بشه که دیگه برای درک بهتر مطالب باید از fat استفاده کنیم و در نتیجه از لایه سخت افزار دور شده ایم.
یه مثال :شما فرض کنید دستگاهی هند هلدی می سازید که قرار آمارگیری کنه و در مواقعی نیاز به جستجو در اطلاعات ذخیره شده هم داره. حالا فرض کنید برای هر فرد یک رکورد که مجموعه ایی از خصوصیت فرد هست می خواد ذخیره بشه. یکی از مشکلات رایج که دیتا بیس می تونه حلش کنه جستجو در بین اطلاعات وارد شده(فرض کنید هر رکورد 500 بایت و ما 20000 نفر وارد کرده ایم) با توجه به اینکه در اغلب میکروکنترلر ها سرعت خواندن از دیوایس هایی جانبی کمه سرعت جستجوی ما به چند ده ثانیه میرسه. و یا اینکه بدلیل یک خطای برنامه نویسی که مستقیم با فایلها کار میکرده تمام رکورد های بالا پاک بشه و یا ...
من خودم چندین مورد پروژه دیدم و کار کردم(شایدم برای من زیادی پیش اومده) که قراره حجم زیادی اطلاعات رو بگیره و ذخیره سازی کنه که اونجا واقعا دیتابیس لازمه. در واقع احساس نیاز شدید من رو به این سمت سوق داده. حالا فقط برای اینکه کار تکراری انجام ندم طرح سوال کردم که چنین چیزی وجود داره یا نه چون هر چی سرچ کردم به جواب دقیقی نرسیدم برای سیستم های بدون سیستم عامل.
البته تقریبا در عید قسمت اصلی یعنی ساختار ایندکس گذاری توسط درختهای b رو انجام دادم(یکی از قابلیت هاش اینه که می تونه یک رکورد رو در بین 100 میلیون رکورد تنها به 3 دسترسی به فایل پیدا کنه اونم بدون هیچ بافر اضافه ایی) .

farshad012
31-12-2014, 23:25
سلام دوستان خسته نباشید
آقا من هم از آی سی at28c64b خواستم استفاده کنم یک حافظه استاتیک موازی هست طبق دیتا شیت ابتدا آدرس رو اعمال میکنم و پالس های پای های ce , oe , wr را به ترتیب برای نوشتن و خواندن به صورت دستی اعمال میکنم (با استفاده از کلید های پول آپ) ولی هر کاری میکنم نمیتونم عمل نوشتن رو انجام بدم در هر حالت که خواندن رو فعال میکنم کلا خروجی ها یک میشه!!! چطوری باید توی این حافظه دیتا نوشت؟؟؟
میشه راهنمایی کنین واقعا چیز ساده ای نمیدونم مشکل کجاست
کاربر ارشد 1nafar گفتن من کار کردم اگه میشه خواهشا کمکم کنین ممنون