Jump to content

    

InsolentS

Свой
  • Content Count

    407
  • Joined

  • Last visited

Community Reputation

0 Обычный

About InsolentS

  • Rank
    Местный
  • Birthday 08/03/1987

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. Пробовал. Восстанавливать соединение приходилось следующим образом: замыкать reset вручную, нажимать "Connect" в J-Flash и отпускать reset. Вообще - согласен, в таких случаях лучше иметь reset на swd разъёме. Можно его вывести на 5-й пин, тогда проводочки будут подходить к 4-х пиновым девайсам..
  2. Мне нравится 4х контактный разъем как на отладочных платах stm32. Ни разу не было потребности во внешнем Reset.
  3. Ура! Живой человек проявил интерес к моему вопросу!! static FRESULT res; static uint32_t total_size, free_size; static FATFS *fs_ptr; res = f_mkfs("", 0, 1); res = f_getfree("", &free_size, &fs_ptr); total_size = (fs_ptr->n_fatent - 2) * fs_ptr->csize * 512; /* TODO: Abstract out the sector size */ free_size = free_size * fs_ptr->csize * 512; Как видите, ничего особенного. total_size и free_size в байтах.
  4. Всем привет! Балуюсь с FatFs поверх AT45. Размер носителя 1мегабайт. После форматирования с помощью f_mkfs наблюдаю ровно 3/4 свободного места на диске (т.е. 768кб). Не понимаю, как служебная область Fat12 может так много занимать, ведь диск у меня всего-то 2048 кластеров размером (кластер = 1 сектор, 1 сектор = 512байт). Это, в теории, получается 1.5байт * 2048кластеров = 3кб на собственно таблицу. Я понимаю, что там ещё есть загрузочные сектора и прочая служебная информация, но ведь не 256кб :05: Я что-то не помню, чтобы у дискеты на 1.44мб было зарезервировано столько места под FAT. Мои предположения: 1) Встроенное в FatFs форматирование чего-то не так форматирует. 2) Я не докурил документацию на Fat. Любая помощь будет принята с благодарностью :beer:
  5. Отписал в личку
  6. Прошу прощения, под свалившейся на меня кучей дел, совсем забыл про этот топик. Ваша логика совершенно верная и ответ должен был быть в точности таким, как Вы предположили. Мне очень стыдно, что я сам до такого не додумался :rolleyes: Спасибо за то что пнули в верном направлении)
  7. Опять кардеры развлекаются :rolleyes:
  8. Спасибо за участие в обсуждении)) Но, мне кажется, что дело не в этом совершенно. Задача имеет чисто алгоритмическое, логическое решение. Результат и решение не имеют привязки к аппаратной платформе, компилятору, оптимизатору и т.п. Этот код предоставлен as-is и вопрос не в том, как сделать из него нормальный код (кстати, если бы переменная была volatile, это разве что-нибудь бы поменяло?).
  9. На работу всё-таки взяли, попробую найти там этого интервьювера и докопаться до истины.. :)
  10. Тут дело не в особенностях какого-то конкретного железа или RTOS (как кстати частота тиков планировщика связана с разрядностью процессора?). Есть определённая последовательность действий, которая в итоге приводит к результату 2. Какие это могут быть действия описаны в листинге в условии задачи. Тут вопрос исключительно на логику. Не уклоняйтесь от решения задачи, вдруг тоже такое когда-нибудь попадётся :rolleyes:
  11. Это условная RTOS. thread_join() просто ждёт пока все потоки завершатся
  12. Прошу прощения, по условиям задачи RTOS вытесняющая, процессор 32бит, count++ компилируется именно в те 3 ассемблерные команды, которые приведены и дело точно не в printf. Даже ежу понятно, что этот код никуда не годится, так не делают и т.п. Но вопрос был именно почему работа определённой программы приводит к определённому результату, шаг за шагом.. Жду.. :)
  13. Всем привет! Недавно был на интервью в одной компании и "застрял" на вопросе про RTOS. После недели поисков ответ так и не был найден.. Условие задачи такое: есть 5 потоков, каждый из них увеличивает в цикле общую переменную count на 1. После завершения работы этих потоков, значение count выводится на экран. unsigned int count = 0; void thread(void) { unsigned int i; for(i = 0; i < 5; i++) { count++; } } void main(void) { thread_create(thread, 5); // Создаём 5 экземпляров потока thread и запускаем их thread_join(); // Ждём пока все 5 потоков завершатся printf("%u", count); // Выводим значение count на экран } Внимание вопрос: почему программа печатает 2?? Договорились с интервьювером, что операция count++ состоит из 3х ассемблерных команд: LDR reg, count ADD reg, #1 STR reg, count Т.к. переменная count не защищена ни мьютексом, ни критической секцией, самый пессимистичный вариант, который я "раскрутил" выглядит так: // начало работы thread1 LDR reg, count // count = 0, thread1.reg = 0 ADD reg, #1 // thread1.reg = 1 // thread1 вытеснен планировщиком, начало работы thread2 LDR reg, count // count = 0, thread2.reg = 0 ADD reg, #1 // thread2.reg = 1 STR reg, count // count = 1 // thread2 завершил работу, управление возвращается к thread1 STR reg, count // count = 1 т.е. в результате один поток делает override результата второго потока и count = 1 после выполнения всех потоков (а не 5, как было бы с мьютексом). Но: хоть один из потоков все равно увеличит count на 1 в этой схеме, т.е. в результате работы программы count будет не меньше, чем 5. Как же получается 2? (со слов интервьювера, он наблюдал такой эффект в реальном железе). Подсказка от интервьювера: результат не зависит ни от количества потоков, ни от количества итераций в цикле for