Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:http-stm32

HTTP server na platformě STM32

Zadání

S využitím vývojových desek STM32F4DISCOVERY a STM32F4DIS-BB zprovozněte Ethernet rozhraní. Implementujte jednoduchý HTTP server, který pomocí dynamicky generovaných stránek umožní grafické zobrazení sledované veličiny.

Úvod

Projekt má za cíl demo aplikaci HTTP serveru. Výsledné demo má sloužit jako základ pro vývoj centrální jednotky senzorické sítě. Tato jednotka bude sbírat údaje ze senzorů v síti a zobrazovat naměřená data uživateli pomocí webových stránek. Dále by tento server mohl sloužit k jednoduchému monitoringu vyvíjených přípravků během testů. (R&D centrum se nachází jinde než testovaný výrobek)

Popis hardwaru a nastavení sítě

Hardware

Server je implementován do vývojového kitu STM32F4DISCOVERY . Kit je osazen mikroprocesorem s jádrem architektury ARM rodiny Cortex M4. K vývojovému kitu je připojená rozšiřující deska STM32F4DIS-BB jinak Base Board. Rozšiřující deska obsahuje Ethernet PHY LAN8720A. Server je napřímo připojen ke klientskému počítači (síť o dvou prvcích). Dále je použit obvod pro emulaci virtuálního COM portu pro zasílání dat k zobrazení. Tento přístup nahrazuje modul sběru dat ze senzorů a samotné senzory. K Base boardu je možné připojit ještě další zařízení jako kamera OV7670, nebo LCD. Ty ovšem nejsou v demo aplikaci použity.

stm32f4dis-ext.jpg

Nastavení sítě

Jedinou věcí která je potřeba, je nastavit manuálně ip adresy obou zařízení. Server je nastaven na adresu 192.168.10.10 z toho plyne, že klientský počítač, je potřeba nastavit na adresu například 192.168.10.11. V budoucnu se samozřejmě očekává, že síť bude mít standartní architekturu a ip adresa serveru bude dynamicky nastavena řídícím prvkem. Pro naši jednoduchou síť postačí tento přístup.

Blokač

Webová stránka

Cílem je webová stránka zobrazující graf hodnot. Za tímto učel nebylo možné se vyhnout použití již napsané funkce v javascriptu. Pro svoji jednoduchost byla zvolena metoda flot využívající funkce knihovního balíku jQuery (Referenční příklad) Použitím těchto knihoven vzroste nárok na velikost paměti serveru o 381 kB a navíc je potřeba tento objem dat odeslat s každým požadavkem na aktualizaci webové stránky.

Obě knihovny jsou napsány v tradičním tvaru - obsahují komentáře a odřádkování. Odstraněním této irelevantní složky zmenšíme nárok na paměť na 191 kB(jquery.flot.min a jquery.min ). Dalším krokem jak zjednodušit práci serveru, je ukládání jíž stáhnutých stránek do cache paměti prohlížeče. Tento jednoduchý server bude podporovat verzi protokolu HTTP 1.0 kde je nastavení cache pamětí složitější a protože se nejedná o klíčový problém tak nebyl vyřešen. Nejvhodnější variantou je odkazovat se na jiné stránky, které také využívají stejné knihovny jQuery jako například www.google.com nebo www.dokuwiki.com. Tato možnost vyžaduje připojení klienta k internetu.

Index html

Snahou je navrhnout stránku tak aby při dynamickém parsování dat serverem bylo zapotřebí co nejmenší počet operací. Proto jako vstupní data pro vykreslení je řetězec znaků reprezentující hodnoty v šestnáctkové soustavě.

Vstupní řetězec v jazyce JavaScript

// 0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC
var input = '000100020003000400050006000700080009000A000B000C'

V následujícím úryvku kódu je ukázka parsování vstupních dat.

var datasets =   [[	
					[1, parseInt(input .substring(0,4),16)],
					[2, parseInt(input .substring(4,8),16)], // ...... ]];

Stránky je možné automaticky aktualizovat pomocí příkazu

<!-- each 1 s -->
<meta http-equiv="refresh" content="1">

Server

Tento projekt vychází ze Software examples pro Base Board. V tomto balíčku je ukázkový projekt implementovaného http serveru který pomocí CGI ovládá jednu LED a periodicky vyčítá hodnu napětí na AD převodníku(SSI). Je možné si zvolit příklad z RTOS a bez něj. Bohužel příklad s RTOS se mi nepodařilo zprovoznit.

Nejnižší komunikační vrstvy jsou naimplementovány lwIP (low weigth IP) stackem. Vrstva http serveru je zřejmě naimplementována knihovnou funkcí vývojářů STM. Kód http stránek je uložen jako jeden string pro každý soubor ve formátu hexadecimálních čísel. Proto byl v perlu napsán script pro překlad ASCII to HEX. Podle vzoru fsdata.c byl vytvořen fsdata_custom.c.

Server Side Includes

Server Side Includes neboli SSI je technika kterou využijeme k implementaci dynamicky se měnících dat. Implementaci SSI poznáme podle koncovky .ssi , .shtml a .shtm tu musíme dodržet i v našem případě. Vkládání textu do uložených stránek v pamětí procesoru probíhá tak že obslužný program obdrží požadavek GET na soubor s koncovkou např. .shtml. Ukazatelem na místo kde bude přidán text se označuje tagem. Například

var input = <!--t-->

Před odesláním souboru probíhá jeho parsování. Text je generován funkcí, která ja volána mechanizmy stacku. Její argumenty jsou dány, proto pole vložených znaku je předáváno globální proměnou s ukazatelem na vkládané pole.

Ring buffer

Řetězec vkládaný má místo tagu je implementovaný jako kruhová paměť. Zde je ukázka kódů na jednom místě.

Declarace a inicializace

typedef struct 
{
  char *data;
   char *start; // prvni addresa paměti..read only 
   char *end;   // posledni addresa paměti..read only 
}sring_buffer;
 
char buff[BUFFER_SIZE*4]="000100020003000400050006000700080009000A000B000C000D000E000F0010";
 
//globalni promenna
sring_buffer sBuffer;
 
sBuffer.data = buf;
sBuffer.start = buf;
sBuffer.end = &buf[BUFFER_SIZE*4 - 1];// 4x char per number

Zápis a čtení z bufferu

//add one char c
//this fcn is used in UART IRQ 
void addData(sring_buffer* buf, char c, int* cnt)
{
	if( c > 0x2F && c < 0x3A  ) 
	{// is it char
	  *(buf->data+(*cnt)) = c;
	  *cnt++;
	}
 
	if(*cnt == 4)
	{// is one number complete
	  *cnt = 0;
	  if(buf->data == buf->end-3)
	  {// ring buffer logic
		buf->data = buf->start;
	  }
	  else
	  {
		buf->data += 4;
	  }
	}
}
 
//pcInsert je ukazatel na pamet ktera bude po ukonceni cteni zkopirovana na misto tagu
//proto je potreba vracet pocet zapsanych znaků
int readAllBuffer(char *pcInsert,sring_buffer* buff)
{
 
  char* pstr = buff->data; // store pointer to init address of buff->data
 
  const char carka = 0x27 ; // char of ' in ascii
  int m; // for for :)
 
    *(pcInsert++) = carka;
 
    for(m=0;m<BUFFER_SIZE;m++)
    {
      if(buff->data == buff->start)
      {// logika ring bufferu
         buff->data = buff->end-3;
      }
      else
      {
        buff->data -= 4; // 4x char per number
      }
 
		// copy data to memory pointed by pcInsert		
      *(pcInsert++) = *(buff->data++);
      *(pcInsert++) = *(buff->data++); 
      *(pcInsert++) = *(buff->data++); 
      *(pcInsert++) = *(buff->data); 
 
      buff->data -= 3;
 
    }
    buff->data = pstr; // restore init address
 
    *(pcInsert) = carka;
 
	return (BUFFER_SIZE*4)+2; //length of copied data
 }

V kódu je zřejmé že ukazatel na ring buffer buf→data je pří čtení inkrementován a při zápisu dekrementován. Výsledkem je, že nejnovější hodnota je vyčtena jako první viz. video.

Příjem dat

Data jsou posílána ve stejném formátu ve kterém jsou vkládána do výsledné www stránky. Vhodné by bylo nastavení DMA kanálu. To je ponecháno pro budoucí vývoj. V tomto projketu je využit pouze periferie přijímače UART. Při příchodu znaku je pomocí přerušení zavolána rutina příjmu dat. Přerušení není nijak omezováno, protože časově citlivá komunikace s Ethernet Phy se děje pomocí periferií a DMA.

Rutina přerušení Uartu

void USART6_IRQHandler(void)
{
   static unsigned int cnt = 0;
   char c;
 
   c = (char)USART_ReceiveData(EVAL_COM1);// read RX UART register
   addData(&sBuffer,c,*cnt); // add one char
 
   // clear flags
   USART6->SR &= ~USART_SR_RXNE;
   NVIC_ClearPendingIRQ(USART6_IRQn);    
 
}

Video

Video naleznete zde heslo je stm32http.

Popis videa

Přes prohlížeč Mozzila firefox jsem se připojil na IP adresu 192.168.10.10, poté jsem přes terminál odesílal pomocí maker terminálu stringy např „0025“. Po každém odeslání jsem stránku z aktualizoval.

Pár slov autora

Projekt je součástí vývoje jedné nejmenované firmy, proto nejsou vloženy žádné zdrojáky. Nicméně jsem se možná trochu rozsáhleji pokoušel nastínit svůj postup k cíli kdyby náhodou někdo řešil podobně zaměřený projekt. Projekt je psán pro placené vývojové prostředí IAR workbench ovšem referenční design STM podporuje i prostředí keil.

2014/http-stm32.txt · Poslední úprava: 2015/01/18 22:33 autor: Ondřej Maňas