Jump to content

    

Flz

Участник
  • Content Count

    41
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Flz

  • Rank
    Участник
  1. Спасибо за пояснение. Я просто именно этого и не мог понять - думал что-то важное, что может повлиять на работу. Теперь буду знать. Да не ошибка, а warning - я там выше не правильно написал.
  2. Этот участок кода: он не мой, это из примера, который приведен на http://infocenter.arm.com/help/index.jsp?t...c/CACHCBBJ.html к данному warning. А мой код если надо, я тоже могу сбросить - это ассемблерная часть TNKernel, я хотел сделать простейший планировщик и убрать, то что у меня не используется - но этот warning меня смущает.
  3. Здравствуйте. Такой вопрос - что означает эта ошибка "A1581W: Added 2 bytes of padding at address 0xb2"? У меня МК STM32, компилятор keil, если это поможет. Возникает эта ошибка при удалении, казалось-бы не нужного и нигде не используемого, части кода в ассемблерной части программы. google ответил - http://infocenter.arm.com/help/index.jsp?t...c/CACHCBBJ.html, но я ничего не понял: Added <no_padbytes> bytes of padding at address <address> The assembler warns by default when padding bytes are added to the generated code. This occurs whenever an instruction/directive is used at an address that requires a higher alignment, for example, to ensure ARM instructions start on a four-byte boundary after some Thumb instructions, or where there is a DCB followed by DCD. For example: AREA Test, CODE, READONLY THUMB ThumbCode MOVS r0, #1 ADR r1, ARMProg BX r1 ; ALIGN ; <<< add to avoid the first warning ARM ARMProg ADD r0,r0,#1 BX LR DCB 0xFF DCD 0x1234 END Results in the warnings: A1581W: Added 2 bytes of padding at address 0x6 The warning can also occur when using ADR in Thumb-only code. The ADR Thumb pseudo-instruction can only load addresses that are word aligned, but a label within Thumb code might not be word aligned. Use ALIGN to ensure four-byte alignment of an address within Thumb code.
  4. Спасибо, буду разбираться.
  5. Здравствуйте. Разбираюсь с USB. Конкретнее с CDC (виртуальный COM порт), реализую на микроконтроллере STM32(L). Библиотека от ST это просто кошмар, поэтому решил написать свою на основе библиотеки от keil. У keil есть реализация HID устройства, а CDC нет. Читая Агурова и статьи в интернете, уже кое-чего добился проходит инициализация – читаются дескрипторы, на ПК подключается драйвер и даже можно найти новый COM порт и открыть его в терминале. А вот с передачей и приемом у меня проблемы – я никак не пойму с какого момента заканчивается общение с нулевой конечной точкой и начинается общение с другими конечными точками. При отладке последовательность запросов у меня такая: 1. GET_DESCRIPTOR_DEVICE (дескриптор устройства) 2. SET_ADRESS 3. GET_DESCRIPTOR_DEVICE (дескриптор конфигурации) 4. SET_CONFIGURATION 5. SET_LINE_CODING 6. GET_LINE_CODING 7. SET_CONTROL_LINE_STATE 8. При открытии виртуального порта в терминале опять SET_LINE_CODING А далее ничего не происходит, даже когда я передаю данные через терминал. Хотя USB не отваливается и продолжает работать дальше. У меня такие вопросы. 1. Что должно происходить дальше? Какие запросы обрабатываться? 2. Что нужно сделать при запросе SET_CONFIGURATION? Я при этом запросе только включаю/настраиваю остальные(не конфигурационные) конечные точки и то не уверен, что правильно? 3. Как и когда правильно настраивать не конфигурационные конечные точки – по дескрипторам конечных точек или нужно учитывать какую-то информацию при запросе с ПК? Вроде пока больше вопросов не вспомню. Заранее благодарю за любую помощь. P.S. Может у кого есть пример для cdc usb, хотя-бы даже для другого микроконтроллера.
  6. Здравствуйте. В режиме wfi просыпание происходит от любого прерывания. А в режиме wfe от события? Что это за событие, я не понимаю, чем оно отличается от прерывания? И еще можно ли как то сделать так, чтобы просыпание происходило только от одного определенного прерывания, а не от любого, при этом не запрещая все остальные прерывания (не запрещая - чтобы не тратить потом время на их включение)?
  7. Разобрался, это я ступил. Там в памяти впритык было, отсюда и проблемы такие.
  8. Здравствуйте. Программирую под STM32 в keil. Есть два куска программы, писали два человека. При их объединении возникают такие ошибки: 1. No space in execution regions with .ANY selector matching startup_stm32l1xx_md.o(HEAP). 2. .\other\AMT_net.axf: Error: L6407E: Sections of aggregate size 0x1000 bytes could not fit into .ANY selector(s). Какая-то проблема с heap, но если честно я не знаю зачем, где и как на микроконтроллере используется куча (может, кто объяснит). Но если убрать оптимизацию в настройках компилятора, эти ошибки исчезают. Объясните, пожалуйста, что происходит, как используется куча, ну можно еще интересное что-то есть чего я не знаю))) Заранее благодарю за любые ответы.
  9. Я выставляю правильную частоту. Event Counters, Exception Trace, Trace Records и Logic Analyzer у меня работают - а работают они только на правильно выставленной частоте. Меня интересует именно printf отладка. Сейчас попробую. Не помогло. Может если у вас есть уже проекты keil с использованием printf для отладки - вы могли бы показать его, если вас не затруднит.
  10. Здравствуйте. Пытаюсь совладать с отладчиком Keil (v4.7). У меня куча плат Discovery, ну и программатор естественно встроенный в них SWD. Переменные и память смотрятся, Event Counters, Exception Trace и Trace Records успешно запускаются и работают. Единственное, что не удалось запустить это Debug (Printf) Viewer. Гуглом пользовался, и пробовал разные варианты - большая их часть сводится к http://armcortexm.blogs.upv.es/stm32f4-dis...viewer-in-keil/. Но так и не работает у меня этот вывод. Может, есть какой-то секрет или с помощью SWD на DISCOVERY этого вообще нельзя сделать и нужен какой-нибудь UlinkPro? Заранее благодарен, за любые советы.
  11. Здравствуйте. Контроллер STM32L. Возможно глупый вопрос - при возникновении прерывания по USART я ухожу по вектору прерывания проверяю флаги, смотрю что было прерывание по передаче, начинаю обрабатывать данное прерывание и тут у меня приходит байт по USART. Но я ведь в это время обрабатываю прерывание по передаче и при окончании обработки уже флаги прерываний проверять не собираюсь. Как поведет себя контроллер - по выходу из прерывания заново вызовет вектор прерывания с флагом по приему или как то иначе. Знаю, что надо читать документацию или на крайний случай экспериментировать, но может, кто уже знает и подскажет сразу. Заранее благодарен за любую помощь.
  12. Точно проверил дизассемблер, а там косяки. Это что-же мне писать на ассемблере эту функцию вручную. А поместить загрузчик вначале, тоже отличная идея. Спасибо за помощь.
  13. Здравствуйте. Пишу Bootloader для stm32l. Встроенный Bootloader так-же используется для первоначального программирования, но для дальнейшей удаленной перепрошивки необходим свой. Принцип такой: 1. В основной программе, по приходу команды через USART о том, что появился запрос о перепрошивки, МК заканчивает все операции, отвечает по USART, что готов и начинает прием программы. Данную программу он записывает на микросхему Flash памяти. 2. После приема всей программы и проверки правильности приема - у меня есть функция которая стирает flash МК и перезаписывает из внешней flash новую программу, я расположил данную функцию по определенному адресу flash. Но естественно выполнять ее из flash не могу, она сотрет сама себя и МК повиснет. Для устранения этого я копирую, данную функцию в RAM(Я же знаю по какому адресу она находится). И пытаюсь перейти ассемблерной командой BX (BLX) на ее выполнение. Вот в последнем действии у меня загвоздка. Во первых нашел интересный факт, что при команде BX и BLX, у адреса перехода первый бит всегда должен быть 1. Грубо говоря если вы хотите перейти по адресу 0x08000000, то команду - BX 0x08000000, давать нельзя, надо давать BX 0x08000001. (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka12545.html). НО даже если в конце ставить эту 1, исполнение программы в RAM не хочет переходить, хотя по адресам FLASH все нормально переходит и выполняет команды. ВОПРОС - почему не хочет переходить на выполнение в RAM? почему переходит только по адресам FLASH? КАК мне тогда перейти на выполнение программы из RAM, по определенному адресу? Заранее благодарен за все советы и ответы.
  14. Я в Keil делал так: 1. В свойствах проекта на вкладке target указываем начало и длину участка памяти для размещения функций в ОЗУ (RAM1). 2. В свойствах файла, функции которого должны быть в ОЗУ указываем для размещения кода регион RAM1. Я как понимаю создание scatter-файла на себя Keil берет сам. А далее в этом файле я уже могу писать код, хоть на ассемблер, хоть на C.
  15. Здравствуйте. Кто-нибудь может подсказать, какие регистры общего назначения использует компилятор в Keil uVision? И может это как-то регулируется. Задача стоит такая: Для меньшего потребления микроконтроллер STM32L1... должен уйти в Low Power Run и выполнять код из RAM, при выключенном FLASH (так мы добиваемся наименьшего потребления). Но код написанный на си в RAM занимает много. В RAM надо всего лишь считать импульсы на входах МК. Может быть у вас будут предложения, как это лучше реализовать? Мои мысли: Основная последовательность работы: 0. Основная программа 1. При входе в асм функцию, которая в RAM переписать регистры ОН в стек или узнать какие регистры ОН компилятор не использует + запретить прерывания. 2. Код на асм, считающий эти импульсы 3. Обратно переписать из стека регистры ОН + разрешаются прерывания 4. Основная программа Где могут быть мои просчеты? Заранее благодарю за советы.