statim
Участник-
Постов
14 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о statim
- День рождения 05.02.1985
Контакты
-
Сайт
Array
-
ICQ
Array
Информация
-
Город
Array
-
ARM7 с программируемой логикой
statim ответил statim тема в В помощь начинающему
Всем спасибо за ответы, постараюсь сделать запуск бинарника из RAM контроллера. -
ARM7 с программируемой логикой
statim ответил statim тема в В помощь начинающему
Сделаю пожалуй как предложил sigmaN, во Flash контроллера Есть только одна проблемма, которую я пока не могу понять как разрешить Например есть кусок логики unsigned short var0; unsigned short var1; unsigned short var2; int myLogic( int *vOPCGetNodeVar(unsigned short dev_addr, unsigned short reg_addr), int *vOPCSetNodeVar(unsigned short dev_addr, unsigned short reg_addr, unsigned short val)) { /* Код */ if(...) { var0=600; } ... return 0; } так вот собственно вопрос где в ОЗУ у меня будут находиться переменные var0, var1, var2 если они будут находиться там-же где и переменные других программ - то ничего оработать не будет, хочется например сделать счётчики, а не получится. И ещё, в связи с использованием ОС я по идее могу запустить эту функцию как Task Напр void myLogic( int *vOPCGetNodeVar(unsigned short dev_addr, unsigned short reg_addr), int *vOPCSetNodeVar(unsigned short dev_addr, unsigned short reg_addr, unsigned short val)) { unsigned short var0; unsigned short var1; unsigned short var2; if( (!vOPCGetNodeVar) || (!vOPCSetNodeVar))return; for(;;) { /* Код */ if(...) { var0=600; } ... } } Но тогда возникает вопрос синхронизации с БД переменных cети Modbus, через очереди делать - очень долго ( посылать сообщение БД "дай переменную", когда БД запустится передаст значение через очередь, затем снова запускается логика, можно конечно попробовать мютексы ) Вариант с отдельной задачей "логики" мне нравится куда больше, но вот как правильно обмениваться чтобы скорость не пострадала ? -
ARM7 с программируемой логикой
statim ответил statim тема в В помощь начинающему
2sigmaN Идея ясна, спасибо. 2rezident Flash проца хватит для логики это 100%, я просто хотел чтобы основная программа каждый раз при запуске грузила его из внешней памяти, (перезагрузки туда/сюда, боюсь за циклы записи внутренней памяти), хотя ... можно сравнивать то что в контроллере и то что во флешке. Но мне все-же интересно сделать запуск из ОЗУ контроллера. -
ARM7 с программируемой логикой
statim ответил statim тема в В помощь начинающему
Дело как раз в том, что вся база (драйвера периферии) меняться не должна т.е "прошивка" должна содержать только участок логики работы устройств, которые подключены к шине RS485. поэтому хотелось чтобы она хранилась во внешней флешь и грузилась в ОЗУ во время инициализации. адреса функций для обращения к драйверам буду передавать в качестве параметра при вызове, но как исполнять из ОЗУ понять не могу :( 2kurtis Спасибо за ссылку, обязательно посмотрю что там и как. К стандартам я не привязан, хочу чтобы логика по возможности писалась на Си. -
ARM7 с программируемой логикой
statim опубликовал тема в В помощь начинающему
Доброго времени суток. Есть проект что-то типа ПЛК на базе AT91SAM7S128/256 В проце крутится FreeRTOS, сервер опроса Modbus сетки на 100 устройств и 1000 переменных, кое-какая периферия, также должен добавиться LAN на WIZNET и ZIGBEE сел 22 кб ОЗУ Осталась только логика, вот мучаюсь вопросом, как-же всё-таки сделать, есть 3 варианта: 1. логика "IF THEN ELSE " и матрица 2. скриптовый язык, можно попробовать FORTH 3. бинарник Больше всего нравится вариант с бинарником (3), не знаю пока до конца как сделать, но можно наверное. Собственно вопросы. Как поступить с бинарником, как заставити его исполняться если учесть что я не хочу перепрошивать проц, есть внешняя SPI FLASH Хватит ли проца на скрипровый язык, скипт должен весить не более 4 кб и выполняться не более 5 мс. Подскажите, может у кого есть опыт? -
Спасибо, что-то нашёл, попробую разместить в буте функцию, так намного локаничнее должно получится.
-
Доброго времени суток. Существует задача перешивать базу данных, находящуюся во FLASH контроллера, из собственной EEPROM Загрузчик базы я написал, работает, а вот с оновным кодом проблеммы... Как сделать перезагрузку контроллера желательно не через WD? По идее я сначала заливаю основную программу, затем шью в конец FLASH бутлоадер. Как можно узнать что проц стартует правильно т.е. с бутлоадера (его работу проверял через Jtag), и при перезагрузке, вызванной основной прграммой. Может есть какой-то другой способ перешивать флешь, и загрузчик отдельный делать не обязательно, а надо просто функцию в бут области разместить? (я не знаю как). Fuses OSCCAL = C7, C7, BF, BF BLEV = 0 BODEN = 0 SUT = 2 CKSEL = F BLB1 = 3 BLB0 = 3 OCDEN = 1 JTAGEN = 0 CKOPT = 0 EESV = 1 BSIZ = 2 BRST = 0 M103C = 1 WDTON = 1 Собственно код загрузчика (слизан у Атмел) /**************** Библиотеки общего назначения ******************/ #include <board.h> /**************** Подключаемые внешние модули всякие******************/ #include "main.h" #define BLOCKSIZE 256 // байт #define SCMDCOUNT 70 #define SCMDLEN (1/*блока*/ * BLOCKSIZE /**/) // 256 #define SCMDADDR 10240 #define LCMDCOUNT 15 #define LCMDLEN (2/*блока*/ * BLOCKSIZE /**/) //512 #define LCMDADDR (SCMDADDR+(SCMDCOUNT*SCMDLEN)) typedef struct database{ unsigned short s_addr; unsigned short e_addr; unsigned short data[384]; }pdatabase; #define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 ) #define _WAIT_FOR_SPM() while( SPMCR & (1<<SPMEN) ); #define _LOAD_PROGRAM_MEMORY(addr) __load_program_memory( (const unsigned char __flash *) (addr) ) #define _FILL_TEMP_WORD(addr,data) __AddrToZWordToR1R0ByteToSPMCR_SPM( (void __flash *) (addr), data, 0x01 ) #define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 ) #define _PAGE_WRITE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x05 ) __no_init __eeprom database db@15; void BlockLoad(unsigned int size, unsigned long *address, unsigned short *cnt) { unsigned int data; long tempaddress; tempaddress = (*address); // Store address in page. do { data = db.data[(*cnt++)]; #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr. _FILL_TEMP_WORD(*address,data); #pragma diag_default=Pe1053 // Back to default. (*address)+=2; // Select next word in memory. size -= 2; // Reduce number of bytes to write by two. } while(size); // Loop until all bytes written. #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr. _PAGE_WRITE(tempaddress); #pragma diag_default=Pe1053 // Back to default. _WAIT_FOR_SPM(); _ENABLE_RWW_SECTION(); // (*address) >>= 1; // Convert address back to Flash words again. } __C_task main(void) { unsigned long addr; unsigned long s_addr; unsigned long e_addr; unsigned short i; unsigned char block_count; unsigned short ee_cnt; void (*funcptr)( void ) = 0x0000; // Set up function pointer to RESET vector. __disable_interrupt(); _ENABLE_RWW_SECTION(); //for(i=0;i<384;i++)db.data[i]=i; //db.s_addr = 10240; //db.e_addr = 11008; s_addr = db.s_addr; e_addr = db.e_addr; if(s_addr>=64000)s_addr = 0x00; while(1){ if(s_addr) {// есть задание записать пару блоков addr = s_addr; block_count = ((e_addr-s_addr)/BLOCKSIZE); // расчитываю количество ee_cnt = 0x00; for(i=0;i<block_count;i++)BlockLoad(BLOCKSIZE, &addr, &ee_cnt); } s_addr = 0x00; e_addr = 0x00; db.s_addr = 0x00; db.e_addr = 0x00; funcptr(); // Перехожу к основной программе } }
-
Интересный девайс попробую купить пару штук, для экпериментов :) 2 sigmaN У TMDSHFK5407 Hands-Free Kit есть 512 кб ОЗУ на плате, а если говорить уже о готовом проекте - то проц будет выбран в зависимости от потребностей ПО. Возможно и TMS320F28235, они подешевле будут ежели F28335 и ресурсов там должно хватить.
-
Беру TMDSHFK5407 Hands-Free Kit, на базе TMS320VC5407-120 - самое то. И буду на нём Speex запускать. Всем спасибо.
-
2 fontp Спасибо за линку Blackfin понравился по периферии и производительности, но смущает отсутствие FLASH TMS320F28335 тоже понравился, но вот доступность... Остановил пока свой выбор на TMS320F28x - его производилельности на 100 мГц, насколько я понимаю, хватить должно, надо только будет потребление посчитать.
-
2AlexandrY Эх зациклился я на этих вокодерах... Эхоподавление конечно-же надо - это скорее портативное устройство для связи, нежели прослушка своей чиксы :) Кстати может кто поделится ссылкой на вокодеры с фиксированной точкой, я только openlpc нашел?
-
DRUID3 Спасибо за развёрнутый ответ, по поводу LPC2400 понятно, но если заказчику захочется качество голоса получше ARM7 уже не справится. Хотелось бы сделать немножко более универсальное.
-
Помогите выбрать процессор если необходимо на нём реализовать: 1. Один канал TCELP 4.6 кбит/с CELP 4.8 кбит/с MELP 2.4 кбит/с LPC 2.4 кбит/с (какой из них еще не выбран) 2. Шифрование данных, что - то вроде AES Всё это должно выполняться в реальном времени + небольшая прикладная задачка типа обработка клавиатуры + запас для того чтобы ещё что нибудь впихнуть. Планирую использовать внешний кодек (что-то вроде AD73322L) поэтому желатетельно наличие I2C, SPI и UART для обмена данными, а так-же достаточный обьём собственной SRAM и FLASH под эти задачи. Корпус и энергопотребление - по минимуму. P.S. В DSP я новичёк, в основном работал с AVR и ARM.
-
Здрасьте, необходимо запустить кодек AT73C213 на AT91SAM7SE-EK, запись в DAC настроек регистров 0х10 и 0х11 через SPI проходит нормально, а регистры с 0х00 по 0х0D я могу только прочитать, данные не записываются. В даташите на AT73C213 есть примечание о том, что MCK должны быть запущены во время циклов записи в регистры с 0х00 по 0х0D, что я и сделал, но результата не последовало MCK = 8xSSCclk Может кто сталкивался с подобной проблемой?