Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как корректно удалить задачу
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
kan35
В общем ситуация такая: есть задача, которая работает с файловой системой, постоянно читая блоки в выделенную задачей область памяти.
Есть необходимость удалять и создавать задачу заново (и довольно часто).
Использую vTaskDelete(Task) и Hook в котором высвобождаю память.
удаление происходит в любой момент, в том числе когда происходит чтение в выделенную задачей память (читаю по DMA). И возникает ситуация, когда память уже удалена, а чтение все еще происходит "на автомате" в заданный блок, который принадлежал задаче которой уже нет... Самое простое - заключить задачу в критическую секцию, но тогда смысл использования DMA с целью освобождения ресурсов CPU сильно теряется.
И вопрос собственно такой: как покрасивее наладить средствами FreeRTOS отсрочивание удаления задачи (при нахождении в определенных областях), но при этом не блокировать задачу для переключения?
Terminator
Вставь в задачу проверку какого-нибудь флага и когда он установлен, пусть удалит себя. Естественно после того как убедится, что DMA окончил работу.
kan35
Ну в общем примерно так и сделал - семафорами. А вообще такое ощущение, что надо делать что то типа отдельного потока, управляющего файловой системой и общаться с ним через очереди queue при чем в обе стороны.
Terminator
Семафор зачем? Так же не понятно зачем в обе стороны.
ИМХО что-то не договариваешь.
kan35
Сейчас сделал так: семафор на входе в процедуру чтения сектор захватывается (take), сама процедура установка начального адреса flash, потом запуск DMA, освобождается семафор только по прерыванию от dma когда передача завершена. Работает отлично, параллельный доступ нескольких задач к диску (к разным файлам) работает без нареканий, хотя выглядит это как заплатка...

А как сделать 2 очередями у меня идея такая. В одну сторону (условно говоря в задачу "FAT") будет очередь из команд со стартовым адресом, и с хендлером таска который отправил запрос. А задача "FAT" будет заполнять другую свою очередь со считанными секторами, которую будут все задачи открывать и проверять что сообщение для той или иной задачи. Проверять время нахождения сообщений в очереди и чистить при невосребованности. В обoем такой типа tcp стек простейший.
Terminator
Слишком сложно, отлаживать замучаешься. Особенно очередь с многими получателями.
Задача отправляющая задание на чтение сектора ждёт окончания его чтения вечно или есть таймаут?
Если таймаута нет, то и нет особого смысла заводить отдельную задачу "FAT", делай всё в процедуре чтения (семафоры dma и т.д.).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.