Перейти к содержанию
    

statim

Участник
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о statim

  • День рождения 05.02.1985

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Всем спасибо за ответы, постараюсь сделать запуск бинарника из RAM контроллера.
  2. Сделаю пожалуй как предложил 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, через очереди делать - очень долго ( посылать сообщение БД "дай переменную", когда БД запустится передаст значение через очередь, затем снова запускается логика, можно конечно попробовать мютексы ) Вариант с отдельной задачей "логики" мне нравится куда больше, но вот как правильно обмениваться чтобы скорость не пострадала ?
  3. 2sigmaN Идея ясна, спасибо. 2rezident Flash проца хватит для логики это 100%, я просто хотел чтобы основная программа каждый раз при запуске грузила его из внешней памяти, (перезагрузки туда/сюда, боюсь за циклы записи внутренней памяти), хотя ... можно сравнивать то что в контроллере и то что во флешке. Но мне все-же интересно сделать запуск из ОЗУ контроллера.
  4. Дело как раз в том, что вся база (драйвера периферии) меняться не должна т.е "прошивка" должна содержать только участок логики работы устройств, которые подключены к шине RS485. поэтому хотелось чтобы она хранилась во внешней флешь и грузилась в ОЗУ во время инициализации. адреса функций для обращения к драйверам буду передавать в качестве параметра при вызове, но как исполнять из ОЗУ понять не могу :( 2kurtis Спасибо за ссылку, обязательно посмотрю что там и как. К стандартам я не привязан, хочу чтобы логика по возможности писалась на Си.
  5. Доброго времени суток. Есть проект что-то типа ПЛК на базе AT91SAM7S128/256 В проце крутится FreeRTOS, сервер опроса Modbus сетки на 100 устройств и 1000 переменных, кое-какая периферия, также должен добавиться LAN на WIZNET и ZIGBEE сел 22 кб ОЗУ Осталась только логика, вот мучаюсь вопросом, как-же всё-таки сделать, есть 3 варианта: 1. логика "IF THEN ELSE " и матрица 2. скриптовый язык, можно попробовать FORTH 3. бинарник Больше всего нравится вариант с бинарником (3), не знаю пока до конца как сделать, но можно наверное. Собственно вопросы. Как поступить с бинарником, как заставити его исполняться если учесть что я не хочу перепрошивать проц, есть внешняя SPI FLASH Хватит ли проца на скрипровый язык, скипт должен весить не более 4 кб и выполняться не более 5 мс. Подскажите, может у кого есть опыт?
  6. Спасибо, что-то нашёл, попробую разместить в буте функцию, так намного локаничнее должно получится.
  7. Bootloader, но не совсем, на Atmega64

    Доброго времени суток. Существует задача перешивать базу данных, находящуюся во 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(); // Перехожу к основной программе } }
  8. Интересный девайс попробую купить пару штук, для экпериментов :) 2 sigmaN У TMDSHFK5407 Hands-Free Kit есть 512 кб ОЗУ на плате, а если говорить уже о готовом проекте - то проц будет выбран в зависимости от потребностей ПО. Возможно и TMS320F28235, они подешевле будут ежели F28335 и ресурсов там должно хватить.
  9. Беру TMDSHFK5407 Hands-Free Kit, на базе TMS320VC5407-120 - самое то. И буду на нём Speex запускать. Всем спасибо.
  10. 2 fontp Спасибо за линку Blackfin понравился по периферии и производительности, но смущает отсутствие FLASH TMS320F28335 тоже понравился, но вот доступность... Остановил пока свой выбор на TMS320F28x - его производилельности на 100 мГц, насколько я понимаю, хватить должно, надо только будет потребление посчитать.
  11. 2AlexandrY Эх зациклился я на этих вокодерах... Эхоподавление конечно-же надо - это скорее портативное устройство для связи, нежели прослушка своей чиксы :) Кстати может кто поделится ссылкой на вокодеры с фиксированной точкой, я только openlpc нашел?
  12. DRUID3 Спасибо за развёрнутый ответ, по поводу LPC2400 понятно, но если заказчику захочется качество голоса получше ARM7 уже не справится. Хотелось бы сделать немножко более универсальное.
  13. Помогите выбрать процессор если необходимо на нём реализовать: 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.
  14. AT91SAM7SE-EK и AT73C213

    Здрасьте, необходимо запустить кодек AT73C213 на AT91SAM7SE-EK, запись в DAC настроек регистров 0х10 и 0х11 через SPI проходит нормально, а регистры с 0х00 по 0х0D я могу только прочитать, данные не записываются. В даташите на AT73C213 есть примечание о том, что MCK должны быть запущены во время циклов записи в регистры с 0х00 по 0х0D, что я и сделал, но результата не последовало MCK = 8xSSCclk Может кто сталкивался с подобной проблемой?
×
×
  • Создать...