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

igorle

Свой
  • Постов

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

  • Посещение

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


  1. "будильник" будет стоять в жилой комнате.Так что фон будет какой угодно. И телевизор, и разговоры, и шум за окном. Расстояние до источника звука тоже может варьироваться. В идеале - как мы ухом распознаем звонок даже из другой комнаты - так хотим распознавать и контроллером. Похоже, что моя главная проблема - принять сигнал с микрофона и подстроить уровень для ADC? Есть ли для этого готовые популярные микросхемы? Или правильнее в моем случае - строить аналоговый узкополосный фильтр, и уже с него сигналы заводить в контроллер?
  2. У нас на фирме приняты правила, совпадающие с НАСАвскими. 1. Любой хедер может быть использован без предварительного инклюда 2. Если хедер зависит от разных файлов в различных компиляциях - то эта зависимость должна быть собрана в файле. Например, мой фал может быть использован и в Кернеле, и в Юзер моде. Тогда делаем что-то вроде: #ifdef __KERNEL__ #include <kernel_types.h> #else #include <user_types.h> #end u32 foo(s16); 3. Исключения допускаются, но программист должен быть в состоянии объяснить, для чего он вводит эту зависимость.
  3. Я понял, что вычислительных возможностей даже MSP430 достаточно. Верно? Но ведь надо еще подготовить сигнал с микрофона. Оценить уровень сигнала. В документе от TI считается чть сигнал уже отрегулирован по уровню В АОНЕ входной сигнал тоже уже более менее с известным уровнем. Как эта часть решается современной базой?
  4. Не знаю, где правильнее задавать такой вопрос - здесь или в DSP. Есть устройство, которое время от времени подает сигнал тревоги - повторяющийся сигнал из двух чередующихся частот с паузой. Типа будильника. Вопрос - можно ли распознавать такой сигнал без специализированного процессора? Через микрофон. Желательно - силами STM32 или даже MSP430. Наверняка, проблема не оригинальная. Можете посоветовать - на какой базе можно реализовать такую задачу? Речь идет не о производстве - о демонстрации (проверке) идеи.
  5. Компилятор может давать ворнинги в случае, если встретит if (a = foo()) Поэтому принято такие конструкции обрамлять дополнительными скобками: if ((a = foo())) Таким образом компилятору и тому, кто будет читать код говорят, что это не опечатка, а так задумано. Это нормальная практика. Я сейчас забежал греп на Кернел Линукс 2.6 - насчитал таких случаев 6932. Программистам следует этот прием если не использовать (некоторым религия не позволяет писать красивый код), то как минимум знать.
  6. Этот вызов никакой смысловой нагрузки не несет. Поэтому я его и предлагал вычистить. Подозреваю, что проблема не в коде, а в окружении. На начальных этапах это сплошь и рядом бывает. Думаешь, что прожег код, а на самом деле загрузил его в эмулятор. Или вообще никуда...
  7. Я по существу ответить не могу. Под рукой нет ничего. Но для начала - я бы причесал код. Чтобы было видно, что вы понимаете что делаете. Например, Ваш код насамом деле выглядит так: #include <msp430x14x.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; P3DIR |= 0x40; // P3.6 P4DIR |= 0x20; // P4.5 P3OUT |= 0x40; // P3.6 P4OUT |= 0x20; // P4.5 for(;;); } Я бы еще проверил значения PxSEL. Возможно, эти ножки по умолчанию не GPIO, а альтернативные. Я, к сожалению, не смог этого понять из даташита.
  8. Другими словами - когда я перехожу из одного таба в другой, мне хотелось бы, чтобы оставленный файл был в соседнем табе. Желательно - справа от текущего (как это работает в Alt TAB при переключении между окнами) Или в крайнем случае - я хочу иметь возможность менять порядок табов. Я постоянно переключаюсь между двумя файлами. Исторически сложилось, что они не рядом. И я постоянно должен или тыкать мышкой, или перебирать по пути массу других файлов :(
  9. Я полагал, что внутри SD карт и флэшэк используют NAND память. Она дешевая, но менее надежная. Надо следить за сбойными блоками, восстанавливать данные и заботиться о равномерном износе. Я остановился на SD карте для своего проекта, так как внутри карты не только память, но и контроллер, который выполняет всю эту грязную работу. Если речь, как у меня, идет не о промышленности, а о небольшом числе самоделок, то можно и подпаяться к панелькам карты.
  10. Нет. Я плохо излагаю свою мысль. Эти две команды перебирают табы по порядку. Когда я перепрыгиваю на открытый ранее файл - это обычно не файл справа. Поэтому CTRL + SHIFT + TAB не поможет.
  11. Получили противоречие. ТС желает, чтобы адрес всегда был адресом, а для семибитного случая код сам пододвигал его на бит влево. И вы его поддержали. А теперь сетуете, что библиотека содержит избыточной код. И отказались вы от библиотеки именно из-за ее избыточности... Я понимаю, когда речь идет о действительно сложных вещах, типа USB. Но UART, SPI и I2C - ведь можно понять за разумное время, верно?
  12. ViKo спасибо. Объяснили - что именно смущает TC. До меня долго не доходило. Меня это не смущает. Невозможно разрабатывать и отлаживать устройство I2C, не зная как работает адресация. Библиотека должна быть минималистична. Но это мои личные предпочтения. (А Кейл тут вообще ни причем)
  13. Почитайте еще раз про битовые поля и посмотрите RM0008, параграф 26.6.3, I2C Own address register 1 (I2C_OAR1) В моей версии РМ это страница 748.
  14. Я тоже ничего странного и неочевидного не заметил. Почему пишется 2A в регистр, а поле читается 15 - вам объяснили. К STM библиотеке это не имеет никакого отношения. Так что уточните, пожалуйста, вопрос. А пока, для тренировки, разберите этот пример int main(void) { union { int word; struct { int add0:1; int add7:6; } fields; } demo; demo.word = 0x2a; printf("add7 %#x\n", demo.fields.add7); return 0; } И угадайте - какой результат будет напечатан. Проверить можно здесь
  15. Спасибо. Уже лучше. Я в подсказках Ctrl TAB не нашел, а сам дальше Alt Tab не продвинулся. Но это все-равно не то. У меня открыты main.c и еще десять открытых файлов. Я открыл included файл, из контекстного меню. Файл расположен не в соседнем табе. И вернуться я не могу - надо пролистывать кучу файлов По вашему вопросу: - Проект как есть у меня не компилируется, так выходит за 32К демо версии кейла - Я заменил My_String на char My_String[20*1024] = "rrrrrrrrrrrrrrrrrrrrrrrrrrrr"; И проблема воспроизвелась: Program Size: Code=1136 RO-data=320 RW-data=20516 ZI-data=1636 - Я поставило в свойствах проекта (закладка Linker) Use Memory Layout from Target Dialog, и проблема разрешилась: .\test_flash_string.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data). PS. Если можно - черкните в личку, где берут Кейл без ограничения демоверсии. Мой проект уже перешел 22К, так что скоро надо будет или искать правильный кейл, или на GCC переходить :(
  16. Навигация в Кейле

    Мне в целом нравится Кейл. Но очень напрягает переход между файлами. Через короткое время открытыми оказываются уже два с лишним десятка файла. Перехода типа Альт ТАБ я не нашел. Постоянно хватаюсь за мышку и выбираю нужный фалй из длиннющего неупорядоченного списка. Горячей клавиши, чтобы вернуться в только что покинутый файл, я не нашел. Иногда выручает F12 / Ctrl- - но только при поиске по тагам. И там иногда он скачет непредсказуемо. У кого-нибудь есть красивые методы переключаться между файлами? Желательно без мышки.
  17. Меня вот это при компиляции смущает. Означает ли это, что размер массива заранее неизвестен, и только в момент компиляции вы хотите задавать? Если да, то это одна задача. Но поскольку звучит МатЛаб, то трудно поверить, что вы хотите вызывать его из Кейла. Значит считаете заранее, и используете в своем коде, как было предложено выше. Можно и руками убрать лишнюю точку с запятой. У меня была аналогичная задача с пересчетом температуры. Я расчитал таблицу на питоне, засунул в файл и использую. Так как в разных проектах диапазон температуры различен - часть массива ограничена ifdefом
  18. Вызовите в начале функции main маллок одного байта, поставьте там брекпоинт. Посмотрите, что вернул маллок и насколько это далеко от границы кучи. Освободите этот байт. Хочется автоматизации - аллоцируйте и осбобождайте блок памяти в цикле, добавляя по одному байту. Когда будет достигнут предел - напечатайте, или зайдите в брекпоинт. Я так понимаю, речь идет не о рабочем коде, а об отладочном - чтобы оценить достаточность кучи?
  19. А что такое "остаток"? Память ведь может быть фрагментирована. Сумма всех кусочков? Единственный путь, известный мне, это в нужной точке устроить крэш тест: аллоцировать память, пока не вернет ошибку. Но и это мало информации дает, так как фрагментация памяти и размер запрашиваемых блоков играют важную роль.
  20. 2toweroff - Спасибо. Жаль что вы написали предыдущее сообщение одновременно со мною :) Теперь никто не поверит, что я сам сообразил, и написал одновремнно с вами :( И за линк спасибо. Документу уже 12 лет, а не потерял актуальности. Я сам не нашел такого хорошего руководства по линковщику.
  21. <Спустя полчаса> Все, спасибо всем. Дошло. Я могу отменить "Use Memory Layout..." на закладке Linker в свойствах проекта, и задать свой скаттер файл. Уже видно, что это не тривиальная задача - написать скаттер файл, но понятно куда грести. Еще раз всем спасибо.
  22. MAP файл нашел. Стало понятно, что за цифры я получал и почему они разные. Стек объявляется НАД всеми данными. Мне это не нравится. Ведь это означает, что если я выйду за пределы стека - то я потру свои переменные. И ловить такую ошибку очень трудно. Я бы хотел разместить стек ПОД всеми данными. Начиная с 0х20000000. Тогда при выходе за стек я получу hard fault. Вопрос - могу ли я в Кейле сказать, где должен начинаться стек? Я не нашел такого файла. Есть <target>.sct. Но он тоже автогенерится. Там есть такая секция RW_IRAM1 0x20000000 0x00005000 { ; RW data .ANY (+RW +ZI) } Возможно, если бы я мог повлиять на этот файл, я мог бы переместить стек туда, куда мне надо.
  23. А если Кейл - куда смотреть?
  24. STM32F103 Keil StdPeriph. Есть два аналогичных проекта. Сравнивая потабово свойства проектов, различий не вижу. Насколько я понимаю, размер стека задается в файле startup_stm32f10x_md.s таким образом: Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ... __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler При этом в одном проекте SP инициализируется значением 0x200004D0, в другом 0x200008F0 Вопросы: - Как образуются эти числа? Я ожидал видеть там 0x20000400 - Что находится под стеком?
  25. Отладка в Keil

    Спасибо. Но поскольку топик называется "Отладка в Кейл" - спрошу еще совета бывалых. Я написал некий код, который имплементирует USB. Железо не поддерживает сигнала подключения USB (не дергает программно резистор на DP). Возможно, поэтому у меня под отладчиком USB код не работает корректно. Винда не видит, когда я забегаю отлаживаемое устройство заново. Есть какие-то специальные приемы у Кейла, для отладки USB? Я, бродя по старым темам форума, натыкался на упоминания методов отладки. Но тогда не понял, а сейчас не нашел :(
×
×
  • Создать...