Я пытаюсь реализовать конечный автомат для чтения и записи данных на флэш-память размером 128K x 8.Я планирую иметь следующие состояния в конечном автомате: -
typedef enum DATA_FLASH_TASK_LIST
{
IDLE = 0;
INIT,
READ,
WRITE,
VERIFY
}
Функция конечного автомата будет выглядеть следующим образом: -
// dataflash.c file
// Глобальная переменная для отслеживания задач флэш-данных
DATA_FLASH_TASK_LIST Current_DataFlash_Task = IDLE;
void DataFlashStateMachine()
{
switch(Current_DataFlash_Task)
{
case IDLE:
{
//Wait for other tasks
Current_DataFlash_Task = IDLE;
}
break;
case INIT:
{
//Erase and initialize the data flash
Current_DataFlash_Task = IDLE;
}
break;
case READ:
{
//Call a function to read contents of data flash
//Address and length of data will be updated in global variables
//Read_Data(data, address, length);
Current_DataFlash_Task = VERIFY;
}
break;
case WRITE:
{
//Call a function to write contents to data flash
//Write_Data(data, address, length);
Current_DataFlash_Task = VERIFY;
}
break;
case VERIFY:
{
//Call a function to compare and verify the read/write data
Current_DataFlash_Task = IDLE
}
break;
}
//Function to check current data flash task
DATA_FLASH_TASK_LIST GetCurrentTask()
{
return Current_DataFlash_Task;
}
//Function to set new data flash task
void SetCurrentTask(DATA_FLASH_TASK_LIST New_DataFlash_Task)
{
Current_DataFlash_Task = New_DataFlash_Task;
}
// файл main.c
int address;
int length;
unsigned char *data;
int main()
{
.
.
.
.
.
while(1)
{
//Continously poll the data flash state machine
DataFlashStateMachine();
}
}
// файл handle_events.c
void handle_events()
{
//Write data
ifGetCurrentTask() == IDLE)
address = 0x8000;
data_length = 500;
SetCurrentTask(WRITE);
//Read data
ifGetCurrentTask() == IDLE)
address = 0x8000;
data_length = 500;
SetCurrentTask(READ);
}
Мне нужна помощь по следующим вопросам:
В hanlde_events (), как узнать, завершены ли операции чтения и записи?Должен ли я реализовать глобальные флаги, которые возвращают SUCCESS / FAILURE из функции DataFlashStateMachine ()?Если да, как мне обработать эти флаги?
Есть ли лучший способ обработки этих операций?