Цитата(prottoss @ Feb 6 2008, 11:48)

Такая вот проблемка. Есть железный SPI0 на AT91SAM7X. По этому интерфейу подключено два устройства, каждое устройство обслуживается своей задачей. Написал вот такой код для обращения к SPI:
Код
code snipped
Поясню идею. Создан флаг блокировки интерфейса. Когда он установлен - интерфейс не блокирован, но при выходе из функции OSFlagPend он автоматически обнуляется, тем самым блокируя интерфейс для всех остальных задач. При выходе из функции передачи SPI_Xfer(...) флаг блокировки опять устанавливется, тем самым разрешая другой задаче работать с интерфейсом...
Вот только что-то не совсем все это работает. Кто знает, поясните, где я ошибаюсь.
Я думаю, что в логике - в программном протоколе или алгоритме. Логическая схема
обмена (на мой взгляд, поскольку я не знаю деталей) может выглядеть так:
Код
TASK0 TASK1
| |
\ /
\ /
\ /
\ /
\ /
|
DRIVER
|
|
PHY IF (SPI0)
| |
| |
DEV0 DEV1
следовательно, требуется два мьютекса.
Если учесть что IF последовательный и устройства могут его использовать только
попеременно, то можно обойтись одним мьютексом (или флагом события, что эквивалентно)
и одной условной переменной, т.е. адресом устройства в SPI - в *одной* задаче.
HTH