esp8266.pp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. {******************************************************************************
  2. Startup code for xtensa-esp8266 using ESP8266_RTOS_SDK V3.3
  3. ******************************************************************************}
  4. {$IFNDEF FPC_DOTTEDUNITS}
  5. unit esp8266;
  6. {$ENDIF FPC_DOTTEDUNITS}
  7. {$goto on}
  8. {$macro on}
  9. interface
  10. implementation
  11. {$IFDEF FPC_DOTTEDUNITS}
  12. uses
  13. EmbeddedApi.ConsoleIO,EmbeddedApi.HeapMGR;
  14. {$ELSE FPC_DOTTEDUNITS}
  15. uses
  16. consoleio,heapmgr;
  17. {$ENDIF FPC_DOTTEDUNITS}
  18. var
  19. _stack_top: record end; public name '_stack_top';
  20. operatingsystem_result: longint; external name 'operatingsystem_result';
  21. procedure PASCALMAIN; external name 'PASCALMAIN';
  22. procedure putchar(c : AnsiChar);external;
  23. function uart_rx_one_char(pRxChar: PAnsiChar): longint; external;
  24. function __getreent : pointer;external;
  25. procedure fflush(f : pointer);external;
  26. procedure vTaskDelay(xTicksToDelay: uint32); external;
  27. procedure flushOutput(var t : TextRec);
  28. begin
  29. fflush(ppointer(__getreent+8)^);
  30. end;
  31. procedure _FPC_haltproc; public name '_haltproc';
  32. begin
  33. writeln;
  34. if operatingsystem_result <> 0 then
  35. writeln('Runtime error ', operatingsystem_result);
  36. writeln('_haltproc called, exit code: ',operatingsystem_result);
  37. flushOutput(TextRec(Output));
  38. repeat
  39. // Allow other tasks to run
  40. // Do not enter deep sleep, can lead to problems with flashing
  41. vTaskDelay(1000);
  42. until false;
  43. end;
  44. procedure app_main;public name 'app_main';
  45. begin
  46. PASCALMAIN;
  47. _FPC_haltproc;
  48. end;
  49. function WriteChar(ACh: AnsiChar; AUserData: pointer): boolean;
  50. begin
  51. WriteChar:=true;
  52. putchar(ACh);
  53. end;
  54. function ReadChar(var ACh: AnsiChar; AUserData: pointer): boolean;
  55. begin
  56. ReadChar := true;
  57. ACh := #0;
  58. repeat
  59. uart_rx_one_char(@ACh); // check failure?
  60. if ACh = #0 then
  61. vTaskDelay(1);
  62. until ACh <> #0;
  63. end;
  64. begin
  65. OpenIO(Input, @WriteChar, @ReadChar, fmInput, nil);
  66. OpenIO(Output, @WriteChar, @ReadChar, fmOutput, nil);
  67. OpenIO(ErrOutput, @WriteChar, @ReadChar, fmOutput, nil);
  68. OpenIO(StdOut, @WriteChar, @ReadChar, fmOutput, nil);
  69. OpenIO(StdErr, @WriteChar, @ReadChar, fmOutput, nil);
  70. end.