ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
326079
mrengineer (02.05.2012 10:34, просмотров: 3802) MBedder
Ускорение работы с SD-картой Товарищи, выскажитесь по следующему поводу. Мне надо ускорить работу с SD-картой. Вернее, перераспределить время. Запись блока 512 байт 5-ю структурами по 90 байт занимает 2 мс. А мне надо читать данные с датчика через АЦП каждую 1 мс и в зависимости от данных писать их на карточку или нет. Сразу оговорюсь, с небольшим буфером в ОЗУ МК (MSP430) пропускной способности карточки хватит т.к. данные пишутся редко. Поскольку процессы эти (запись и чтение АЦП) не асинхронные, я получаю проблемы - АЦП читается реже чем с периодом 1 мс если случается запись на карту... Я вижу следующие варианты что мне делать: 1. Сделать процесс записи асинхронным, т.е. обеспечить выполнение основной программы пока идет запись на карту. Для этого надо научиться возвращаться в точку кода где у меня mmcCheckBusy(); Т.е. пока busy - выполняется main. char mmcWriteBlock (const unsigned long address){ unsigned long i = 0; char rvalue = MMC_RESPONSE_ERROR; // MMC_SUCCESS; // Set the block length to read if (mmcSetBlockLength (512) == MMC_SUCCESS) // block length could be set { // SS = LOW (on) CS_LOW; // send write command mmcSendCmd (24,address, 0xFF); // check if the MMC acknowledged the write block command // it will do this by sending an affirmative response // in the R1 format (0x00 is no errors) if (mmcGetXXResponse(MMC_R1_RESPONSE) == MMC_R1_RESPONSE) { spiSendByte(0xff); // send the data token to signify the start of the data spiSendByte(0xfe); // clock the actual data transfer and transmitt the bytes for (i = 0; i < 512; i++) spiSendByte(mmc_buffer[i]); // mmc_buffer[i]; Test: i & 0xff // put CRC bytes (not really needed by us, but required by MMC) spiSendByte(0xff); spiSendByte(0xff); // read the data response xxx0<status>1 : status 010: Data accected, status 101: Data // rejected due to a crc error, status 110: Data rejected due to a Write error. mmcCheckBusy(); } else { // the MMC never acknowledge the write command rvalue = MMC_RESPONSE_ERROR; // 2 } } else { rvalue = MMC_BLOCK_SET_ERROR; // 1 } // give the MMC the required clocks to finish up what ever it needs to do // for (i = 0; i < 9; ++i) // spiSendByte(0xff); CS_HIGH; // Send 8 Clock pulses of delay. spiSendByte(0xff); return rvalue; } // mmc_write_block 2. Пересадить как-то АЦП на прерывания (как?!). Например, в таймер. Но я намеренно перенес чтение АЦП и обработку данных в main() т.к. после этого я сразу перевожу проц в сон LPM4. А из прерываний этого делать не рекомендуется... 3. Уменьшить размер блока до 90 байт. Т.е. вместо mmcSetBlockLength (512) поставить mmcSetBlockLength (90). Это вообще поможет? 4. Другие идеи?