Добрый день недавно начал осваивать Protothreads от Adam Dunkels. Решил добавить переинициализацию потока при зависании опроса флага, но нечего путнего не нашёл как написать свой велосипед, в котором как всегда чего -то не хватает.
В общем задача следующая. По запросу HTTP надо выдать картинку которая находится в ПЗУ. И в момент считывания из ПЗУ (загрузочный сектор или данные картинки) происходит обрыв интерфейса ПЗУ. С дальнейшими действиями программы я ещё не могу определится но пока остановился на том что если обрыв произошёл до отдачи данных, То можно выдать что картинка не найдена, если же часть картинки была отправлена, то просто сбрасываю все соединения делаю переинициализацию интерфейса ПЗУ и запускаю поток с начала.
Так вот пока мне не понятно как узнать как завершился поток.
Т.е в функции A25L080_ReadData_thread я могу засечь время опроса флага
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
И если превышен таймаут установить флаг, но как его передать в функцию Http не понятно.
Передавать через глобальные переменные пугает то что, это будет не достоверно что он пришел из функции A25L080_ReadData_thread запущенной из потока Http,а не из левого потока работы с ПЗУ(хотя такое теоретически не может возникнуть).
А через Return выдавать не получается из за конструкции макросов PT_THREAD.
Ещё думал как сделать выдачу через PtOpen(pt ), но хорошего варианта не придумал.
void Http(){
//Http Запрос
............
PT_WAIT_THREAD(OpenFile_thread(&PtOpen,&FileSystem,uri_name,id));
//Вот тут как-то надо определить как завершился поток OpenFile
..........
}
PT_THREAD(OpenFile_thread(struct pt *pt,MY_NTFS *fs,const char *name,unsigned char id)){
//----------------------------------------
PT_BEGIN(pt);
PT_INIT(&Point_Read_MFT_Thread);
while(1){
PT_WAIT_THREAD(pt,Read_MFT_thread(&Point_Read_MFT_Thread,id));
//----------------------------------------
search_file(&fs,name);
//----------------------------------------
PT_END_YIELD(pt);
}
PT_END(pt);
}
//==============================================================================
/*
* @Описание: Считывает загрузочный сектор.
*/
PT_THREAD(Read_MFT_thread(struct pt *pt,unsigned char id)){
unsigned char i=0;
PT_BEGIN(pt);
PT_INIT(&A25L080_ReadData);
while(1){
//-------------------------------------------------------------------------
PT_WAIT_THREAD(pt,A25L080_ReadData_thread(&A25L080_ReadData,Addr_MFT,(unsigned char*)MasterFileTable,list_len,id));
//-------------------------------------------------------------------------
MasterFileTable[0].FileStartAddr=SECTOR_1;
//--------Создаем имя для пустых файлов------------------------------------
for (i=0;i<END_LIST;i++){
MasterFileTable[i].FileName[19]=0;
}
//-------------------------------------------------------------------------
PT_END_YIELD(pt);
}
PT_END(pt);
}
PT_THREAD(A25L080_ReadData_thread(struct pt *pt,unsigned int addr,unsigned char *data,unsigned int len,unsigned char id)){
static unsigned int i=0;
static struct pt PointReadData;
static unsigned char StatusReadData;
PT_BEGIN(pt);
Init_Port_eeprom_A25L080_thread();
PT_INIT(&PointReadData);
while(1){
StatusReadData=WIP;
//-----ожидание завершения записи-------------
while(StatusReadData==WIP){
PT_WAIT_THREAD(pt,A25L080_ReadStatusReg_thread(&PointReadData,&StatusReadData,id));
StatusReadData=StatusReadData&WIP;
}
//while(flash_read_status_reg()&WIP==WIP);
//--------------------------------------------
FLASH_CS_LOW
//-----------command(Read Data Bytes)---------
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR = 0x03;
while (!(SPI2->SR & SPI_I2S_FLAG_RXNE)){PT_YIELD(pt);}
//------------------------addres--------------
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR = ((addr & 0x00FF0000) >> 16);
while (!(SPI2->SR & SPI_I2S_FLAG_RXNE)){PT_YIELD(pt);}
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR = ((addr & 0x0000FF00) >> 8);
while (!(SPI2->SR & SPI_I2S_FLAG_RXNE)){PT_YIELD(pt);}
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR = ((addr & 0x000000FF) >> 0);
while (!(SPI2->SR & SPI_I2S_FLAG_RXNE)){PT_YIELD(pt);}
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR;
//--------------data--------------------------
for(i=0;i<=len;i++){ //это типо 256
while (!(SPI2->SR & SPI_I2S_FLAG_TXE)){PT_YIELD(pt);}
SPI2->DR = 0x0FF;
while (!(SPI2->SR & SPI_I2S_FLAG_RXNE)){PT_YIELD(pt);}
data[i]=SPI2->DR;
}
//-------------------------------------------
FLASH_CS_HIGH
//-----ожидание завершения записи-------------
do{
PT_WAIT_THREAD(pt,A25L080_ReadStatusReg_thread(&PointReadData,&StatusReadData,id));
StatusReadData=StatusReadData&WIP;
}while(StatusReadData==WIP);
//------------------------------------------
PT_END_YIELD(pt);
//------------------------------------------
}
PT_END(pt);
}