C 在数据闪存中实现状态机读写数据

C 在数据闪存中实现状态机读写数据,c,state-machine,C,State Machine,我正在尝试实现一个状态机来读取和写入数据到128K x 8数据闪存。 我计划在状态机中具有以下状态:- typedef enum DATA_FLASH_TASK_LIST { IDLE = 0; INIT, READ, WRITE, VERIFY } 状态机功能如下所示:- //dataflash.c文件 //用于跟踪数据闪存任务的全局变量 DATA_FLASH_TASK_LIST Current_DataFlash_Task = IDLE; void DataFlashStateMachi

我正在尝试实现一个状态机来读取和写入数据到128K x 8数据闪存。 我计划在状态机中具有以下状态:-

typedef enum DATA_FLASH_TASK_LIST
{
IDLE = 0;
INIT,
READ,
WRITE,
VERIFY
}
状态机功能如下所示:-

//dataflash.c文件

//用于跟踪数据闪存任务的全局变量

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()中,如何知道读写操作是否已完成?我应该实现从DataFlashStateMachine()函数返回成功/失败的全局标志吗?如果是,我如何处理这些标志

  • 有没有更好的方法来处理这些操作


  • 每个硬件设备都有其自身的具体情况。您需要仔细研究设备的文档,文档将指示要使用的状态机,您应该等待多长时间,如何确保事情实际发生……您是否正在编写直接访问闪存(例如通过SPI)的低级驱动程序或库?或者你是在使用现有的界面,比如Flash翻译层,还是操作系统?在第一种情况下,我认为状态机中缺少了一些东西:擦除步骤。您不能直接写入闪存,您必须先擦除(一个页面或一个扇区,具有不同的定时和限制),然后编程否,我不是在编写低级驱动程序。这些措施已经到位。没有操作系统。是的,我正在删除该扇区,然后再写信给它。我没有详细提到代码,因为我的重点是如何知道读写操作已经完成。我需要在hanlde_events()函数中了解它们。