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

esaulenka

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    1

Весь контент esaulenka


  1. Нарисовать в автокаде (это на порядок удобнее), перенести DXF в пикад, обвести получившийся набор линий. У нас так конструктор логотип нарисовал компании. Забавная штука получилась :) Вот только конструктор - бывший, посему подробности не расскажу...
  2. Угу, портится R0 и STRB вполне законно вылетает. Только вот всё остальное-то работает! В частности, в том же самом месте эта memcpy нормально вызывается 0x3890 раз (собственно, считываем прошивку целиком кусочками по 16 байт в один и тот же буфер). И дальше нормально выполняется, если указатель руками переставить... Прерывания выключать не пробовал, т.к. всё развалится. Хотя вот Test() вызывал до разрешения прерываний, оно работает. Освобожусь чуток, постараюсь разобраться...
  3. LPC2138, memcpy и DataAbort

    Наткнулся на непонятную проблему... Исходные данные: Keil, компилятор - древний кейловский CARM, оптимизаций нет. процессор LPC2138 Есть такой код (вопросы по оптимальности использования LDRB/STRB, перебрасывания регистров туда-сюда - к авторам библиотек к CARM) 0x000388F4 E59FC000 LDR R12,[PC] 0x000388F8 E12FFF1C BX R12 0x000388FC 00038901 DD 0x00038901 strlen: 0x00038900 2100 MOV R1,#0x00 0x00038902 E000 B 0x00038906 0x00038904 3101 ADD R1,#0x01 0x00038906 1C02 ADD R2,R0,#0 0x00038908 3001 ADD R0,#0x01 0x0003890A 7812 LDRB R2,[R2,#0x00] 0x0003890C 2A00 CMP R2,#0x00 0x0003890E D1F9 BNE 0x00038904 0x00038910 1C08 ADD R0,R1,#0 0x00038912 4770 BX LR 0x00038914 E59FC000 LDR R12,[PC] 0x00038918 E12FFF1C BX R12 0x0003891C 00038921 DD 0x00038921 memcpy: 0x00038920 B430 PUSH {R4-R5} 0x00038922 1C03 ADD R3,R0,#0 0x00038924 1C18 ADD R0,R3,#0 0x00038926 E005 B 0x00038934 0x00038928 1C0C ADD R4,R1,#0 0x0003892A 7825 LDRB R5,[R4,#0x00] 0x0003892C 1C04 ADD R4,R0,#0 0x0003892E 7025 STRB R5,[R4,#0x00] 0x00038930 3101 ADD R1,#0x01 0x00038932 3001 ADD R0,#0x01 0x00038934 1C14 ADD R4,R2,#0 0x00038936 3A01 SUB R2,#0x01 0x00038938 2C00 CMP R4,#0x00 0x0003893A D1F5 BNE 0x00038928 0x0003893C 1C18 ADD R0,R3,#0 0x0003893E BC30 POP {R4-R5} 0x00038940 4770 BX LR вызываем memcpy (0x40002390, 0x00038910, 0x10) ... и попадаем в DataAbort. Содержимое регистров: R0 = 0x0000008A R1 = 0x00038911 R2 = 0x0000000D R3 = 0x40002390 R4 = 0x0000008A R5 = 0x0000001C R13 (SP) = 0x40002524 R14 (LR) = 0x00038936 R15 (PC) = 0x00000010 SPSR = 0x00000030 Какая-то мистика. memcpy (0x40002390, 0x00038920, 0x10) memcpy (0x40002390, 0x00038900, 0x10) - всё проходит нормально. Если выполнять этот код по шагам, всё также проходит нормально. Запускаем в обычном режиме - получите переход на 0x10... Экспериментально установлено, что если дошагать до 0x00038926 E005 B 0x00038934 дальше всё работает. Если запустить на выполнение до этой строки, получаем ошибку. Сделал тестовую функцию - она тоже работает нормально! Да, она действительно работает, оптимизатор до неё не добрался. Адреса менял - пофигу... void Test (void) { char buff[128]; int ptr = 0x038910; // этот адрес менял уже из-под отладчика while (1) { memcpy (buff, ptr, 16); } } Собственно, вопрос. Что это было?! Нарисовал CopyMem, которая копирует по 4 байта за раз - она работает хорошо. Но хочется разобраться...
  4. Защита

    Забавно :) Как раз этим вопросом озадачился час назад. Итог - защита победила, пришлось делать отладочные спец-прошивки. Дано: LPC2138, Mt-Link, Segger RDI, Keil. Моё видение процесса: Мт-линк перезагружает контроллер. Бут видит magic, отключает джитаг. Основная программа пишет 0x04 в PINSEL2 - включает джитаг обратно. Однако процесс этот идёт неспешно, и мт-линк успевает убедиться, что джитаг отключен. Хм... Мысль: в настройках RDI есть некий macro file. Надо будет на досуге посмотреть... PS Для LPC'шек это верно? Там ведь только блоками можно писать, и никто не говорит, не пишутся ли там какие-нибудь контрольные суммы.
  5. Вы, случаем, не файлик <название-проекта>.axf ищете? :)
  6. поставить галку Project -> Manage -> Components,Environment,... -> Folders -> Use RealView Compiler (путь у меня сразу прописан правильный. если надо, уточнить) скопировать C:\Keil\ARM\Startup\Philips\Startup.s вместо используемого. В принципе, там только синтаксис макросов поменялся и символ комментария, можно и старый поправить А этот компилятор, которым пытаетесь собрать, помер... AARM MACRO ASSEMBLER V2.50 COPYRIGHT KEIL ELEKTRONIK GmbH 2003 - 2006 ARM COMPILER V2.54a - SN: Eval Version COPYRIGHT KEIL ELEKTRONIK GmbH 2003 - 2006 LARM LINKER/LOCATER V2.54a - SN: Eval Version COPYRIGHT KEIL ELEKTRONIK GmbH 2001 - 2006
  7. Небольшое уточнение. Вчера одним глазом посмотрел даташит на ATXL210. Для них нужны не два канала АЦП, а ещё пара таймеров с input capture - на выходе у него ШИМ. Требования к этому датчику Вы не озвучивали. Наверное, также надо опрашивать с частотой 100..200 Гц Примечание номер раз. Память, с которой могут работать одновременно два контроллера, штука редкая. О существовании такой флеш-памяти я вообще ни разу не слышал (правда, и не интересовался специально). О том, что запись во флеш мгновенно не осуществляется, молчу :) Примечание номер два. Программа на дельфи в реальном времени? Ой, не верю :)
  8. Какая-то неправильная задача :) Зачем вашей программе знать, что 499 тысяч раз в секунду НИЧЕГО НЕ МЕНЯЛОСЬ? Кроме того, такой объем данных уже достаточно сложно передавать - UART уже не успеет, а эмулятор COM-порта на USB при работе с отдельными байтами работает даже медленнее (во всяком случае, в моей реализации :) Предлагаю два варианта: - с компьютера приходит запрос, контроллер отвечает "двигатель 1 повернулся на 125 импульсов вправо, двигатель 2 повернулся на 13 импульсов влево, акселерометр показывает 43 попугая" - контроллер самостоятельно отправляет посылки "двигатель 1 повернулся влево", "двигатель 2 повернулся вправо" и т.д. на каждое изменение
  9. Критики? Да сколько угодно :) Предлагаю воспользоваться кнопочкой "поиск". Например, заслуживает тщательного изучения следующая тема: http://electronix.ru/forum/index.php?showtopic=55392 Мне кажется, что - контроллер должен быть один. С отладкой взаимодействия нескольких контроллеров пока лучше не сталкиваться :) - АВРки тут вполне достаточно. Особенно если не заморачиваться с USB (опять таки, для начинающих могут быть проблемы), а воспользоваться RS232. - основная проблема - правильно передать данные из контроллера в этот Ваш LabView.
  10. О! Скажите, а стек вы готовый использовали? Посмотрел, что есть готового... Грустно как-то - какой-то маловразумительный код, практически без комментариев... Собственно, у меня задача попроще. Мне надо просто собрать USB-дескрипторы с внешних устройств, никакой поддержки mass storage и прочих HID'ов не требуется.
  11. Во-во! :) Не занимайтесь ерундой: ресурс флеша не закончится! Раньше закончится проект или помрут ноги от коротких замыканий :) Надо написать такой scatter-файл, чтобы кейл прошивку располагал в ОЗУ (см. хелп кейла). Также надо как-то передавать туда управление. Думаю, соответствующая команда бутлоадера (см. даташит, ISP Commands) должна помочь :) Такой задачей никогда не занимался, делал чуть попроще - две прошивки во флеши, одна из которых располагалась по ненулевому адресу.
  12. Испугался и скачал свежий даташит. В разделе "эррата" про I2C (пардон, TWI!) ни слова. Уточните, пожалуйста!
  13. ARM и Keil

    В комментариях, да? Почему-то такое происходит с курсивом (он же - Italic). Обычный шрифт (Normal) показывает... Edit -> Configuration -> Color&Fonts
  14. Почитал доки на SRecord, спасибо. Выяснил существование кучи вкусностей - можно дополнить файл до нужного размера, порезать, склеить, добавить контрольные суммы... Подскажите, как написать красивее, без exclude ? rem вставим контрольную сумму srec_cat ^ firmware.bin -binary ^ -exclude 0x1000 0x1004 ^ -little_endian_checksum_negative 0x1000 4 4 ^ -o firmware.bin -binary И ещё. У нас для вставки билда в файл прошивки используется самописная утилитка, которая берёт результаты svn info <url>, вытаскивает оттуда revision, добавляет единицу и записывает в бинарник. svn info выдаёт что-то вроде Path: *** URL: *** Repository Root: *** Repository UUID: *** Revision: 681 Node Kind: directory Last Changed Author: esaulenko Last Changed Rev: 680 Last Changed Date: 2009-06-18 14:41:49 +0400 (Чт, 18 июн 2009) Нет желающих попинать автора SRecord, чтобы он реализовал нужный формат? :) Или все как-то по-другому контрольную сумму вставляют?
  15. Подниму тему. Где взять эту же bin2hex, но с перламутровыми пуго... собранную под win32 ? Утилиткой hex2bin v1.0.1, Copyright © 1999 Jacques Pelletier могу поделиться. Работает на порядок быстрее кейловской.
  16. В очередной раз сработала примета "напиши о проблеме, она сама решится" :) Банально вынес объявление векторов в отдельную процедурку, сказал "положить в ОЗУ" и кейл сделал всё самостоятельно. Чудеса :) AREA VECTORS_TBL, CODE, AT 0x40000000 VECTORS_TABLE PROC ARM Vectors: LDR PC,Reset_Addr LDR PC,Undef_Addr LDR PC,SWI_Addr LDR PC,PAbt_Addr LDR PC,DAbt_Addr NOP /* Reserved Vector */ LDR PC,[PC, #-0x0FF0] /* Vector from VicVectAddr */ LDR PC,FIQ_Addr Reset_Addr: DD Reset_Handler Undef_Addr: DD Undef_Handler?A SWI_Addr: DD SWI_Handler?A PAbt_Addr: DD PAbt_Handler?A DAbt_Addr: DD DAbt_Handler?A FIQ_Addr: DD FIQ_Handler?A ENDP AREA STARTUPCODE, CODE, AT 0x00002000 PUBLIC __startup __startup PROC ARM Reset_Handler: // дальше совсем неинтересно :)
  17. Подниму тему. Скажите, а как красиво расположить вектор IRQ в ОЗУ? Вот эту конструкцию надо как-то отвязать от PC: LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr Хотя и остальные вектора сделал как-то коряво... В стартапе вместо LDR PC, Addr сделал LDR R0, =0x40000000 LDR R1, Reset_Addr STR R1, [R0, #0x00] Надо бы какие-нибудь асмовые исходники почитать на досуге... Компилятор кейл, камень - 2138 (впрочем, это влияет только на расположение VicVectAddr).
  18. Раз подняли эту тему: а чем отличаются корпуса CAT и CAY ? Ну и у панасоника аналогично - EBX2 / EBXN. Т.е. даже не "чем отличаются" (это и так хорошо видно), а "ЗАЧЕМ они отличаются?".
  19. А в каком стандарте появились безымянные члены структур? Древний кейловский CARM нормально кушает объявление typedef struct { union { unsigned long long num; unsigned char ddb[8]; struct { unsigned long nlo; unsigned long nhi; }; }; char cnt; } Numb_t; не ругается на Numb_t numb; numb.cnt = 1; зато на numb.num = 2; говорит, что undefined member Хм. Keil RealView (этот довольно свежий) пишет варнинги "expected an identifier" уже при объявлении структуры и ошибку struct "<unnamed>" has no field "num" IAR для АВРов кушает этот код без проблем.
  20. ничего точнее RS-232 на 115200 не планируется. Ну, USB, но там однозначно написано - нужен кварц. Т.е. работать будет, да?
  21. Я не зря упомянул, что работаю с карточкой работаю по одному сектору. Основные проблемы, как мне кажется (подробного исследования не делал) - большая задержка между командой "считать сектор" и началом выдачи данных. Эти измерения наверняка проводились на команде "считать несколько секторов, пока не остановим", оно должно работать заметно шустрее. И на запись значения тоже будут другие. Надо срочно задуматься, нужно ли писать за раз мегабайты в одно место, или нужно писать разные кусочки по 512 байт. Скорость будет принципиально разная.
  22. Дурацкий вопрос: а кто-то гарантирует, что на SD можно записывать 5 мегабайт в секунду? У меня (правда, контроллер другой, и работаю я только на чтение) процесс весьма неспешен. Точно не мерял, но получается заметно меньше 5 Мбайт/сек. Впрочем, можно списать на мои кривые руки, старый контроллер SD в моём камне, на работу с карточкой по одному сектору, ... Впрочем, функция эта в моём устройстве используется больше в технологических целях, юзер может и потерпеть :)
  23. А что происходит между 3,0 и 2,65 ? "Работает, но мы ничего не обещаем" ? :) Александр, и ещё вопрос: какая точность у встроенного RC-генератора? в одном месте обещают 1%, но при каких условиях, непонятно (любые разрешённые напряжения питания, любая разрешённая температура?)
  24. И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени? Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode.
  25. Спасибо! Только вот почему-то не работает... Нажимаю Options - Utilites - J-Link/J-Trace - Settings - Programming Algorithm - Add Выбираю LPC2000 IAP2 256kB Flash, жму OK. Окошко алгоритмов программирования по-прежнему пустое. Несколько первых позиций в списке добавить можно, причём появляется не то, что я добавлял. При попытке записать во флеш кейл ругается, что не знает алгоритм. Не сталкивался никто, случаем? Подозреваю, будет универсальный совет "обновись" - сейчас 3.62c.
×
×
  • Создать...