Adafruit_ST7735 + rtos зависает

chiffa
Offline
Зарегистрирован: 30.04.2014

Всем привет. Пытаюсь сделать вывод на экран в 2х разных потоках, через Adafruit_ST7735. Как МК использую Raspberry pi pico. Код:

 

#include <Adafruit_GFX.h>    
#include <Adafruit_ST7735.h> 
#include <SPI.h>

#include <mbed.h>
#include <rtos.h>
#include <platform/Callback.h>

using namespace rtos;


#if !defined(ARDUINO_ARCH_RP2040)
#error For RP2040 only
#endif

#if defined(ARDUINO_ARCH_MBED)

#define PIN_SD_MOSI       PIN_SPI_MOSI
#define PIN_SD_MISO       PIN_SPI_MISO
#define PIN_SD_SCK        PIN_SPI_SCK
#define PIN_SD_SS         PIN_SPI_SS

#else

#define PIN_SD_MOSI       PIN_SPI0_MOSI
#define PIN_SD_MISO       PIN_SPI0_MISO
#define PIN_SD_SCK        PIN_SPI0_SCK
#define PIN_SD_SS         PIN_SPI0_SS

#endif


#define _RP2040_SD_LOGLEVEL_       0
#include <RP2040_SD.h>


#define ST7735_DRIVER
#define TFT_INVERSION_ON

#define TFT_CS 18
#define TFT_RST 22
#define TFT_DC 19
#define TFT_SCLK 21

#define TFT_MOSI 20 

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

Semaphore s1(1);
Semaphore s2(0);

Thread t2;





#define BUFFPIXEL 20


uint16_t read16(File f) {

  uint16_t result;

  ((uint8_t *)&result)[0] = f.read(); // LSB

  ((uint8_t *)&result)[1] = f.read(); // MSB

  return result;

}


uint32_t read32(File f) {

  uint32_t result;

  ((uint8_t *)&result)[0] = f.read(); // LSB

  ((uint8_t *)&result)[1] = f.read();

  ((uint8_t *)&result)[2] = f.read();

  ((uint8_t *)&result)[3] = f.read(); // MSB

  return result;

}

void bmpDraw(char *filename, uint8_t x, uint16_t y) {


  File     bmpFile;

  int      bmpWidth, bmpHeight;   // W+H in pixels

  uint8_t  bmpDepth;              // Bit depth (currently must be 24)

  uint32_t bmpImageoffset;        // Start of image data in file

  uint32_t rowSize;               // Not always = bmpWidth; may have padding

  uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel)

  uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer

  boolean  goodBmp = false;       // Set to true on valid header parse

  boolean  flip    = true;        // BMP is stored bottom-to-top

  int      w, h, row, col;

  uint8_t  r, g, b;

  uint32_t pos = 0, startTime = millis();


  if((x >= tft.width()) || (y >= tft.height())) return;


  Serial.println();

  Serial.print(F("Loading image '"));

  Serial.print(filename);

  Serial.println("'");


  // Open requested file on SD card

  if ((bmpFile = SD.open(filename)) == NULL) {

    Serial.print(F("File "));
    Serial.print(filename);
    Serial.println(F(" not found"));

    return;

  }


  // Parse BMP header

  if(read16(bmpFile) == 0x4D42) { // BMP signature

    Serial.print(F("File size: ")); Serial.println(read32(bmpFile));
	


    (void)read32(bmpFile); // Read & ignore creator bytes

    bmpImageoffset = read32(bmpFile); // Start of image data

    Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC);

    // Read DIB header

    Serial.print(F("Header size: ")); Serial.println(read32(bmpFile));

	

    bmpWidth  = read32(bmpFile);

    bmpHeight = read32(bmpFile);

    if(read16(bmpFile) == 1) { // # planes -- must be '1'

      bmpDepth = read16(bmpFile); // bits per pixel

      Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth);

      if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed


        goodBmp = true; // Supported BMP format -- proceed!

        Serial.print(F("Image size: "));

        Serial.print(bmpWidth);

        Serial.print('x');

        Serial.println(bmpHeight);



        rowSize = (bmpWidth * 3 + 3) & ~3;



        if(bmpHeight < 0) {

          bmpHeight = -bmpHeight;

          flip      = false;

        }


        // Crop area to be loaded

        w = bmpWidth;

        h = bmpHeight;

        if((x+w-1) >= tft.width())  w = tft.width()  - x;

        if((y+h-1) >= tft.height()) h = tft.height() - y;




		tft.startWrite();
        tft.setAddrWindow(x, y, w, h);
        tft.endWrite();

        for (row=0; row<h; row++) { // For each scanline...


          if(flip) // Bitmap is stored bottom-to-top order (normal BMP)

            pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;

          else     // Bitmap is stored top-to-bottom

            pos = bmpImageoffset + row * rowSize;

          if(bmpFile.position() != pos) { // Need seek?

            bmpFile.seek(pos);

            buffidx = sizeof(sdbuffer); // Force buffer reload

          }


          for (col=0; col<w; col++) { // For each pixel...

            // Time to read more pixel data?

            if (buffidx >= sizeof(sdbuffer)) { // Indeed

              bmpFile.read(sdbuffer, sizeof(sdbuffer));

              buffidx = 0; // Set index to beginning

            }


            // Convert pixel from BMP to TFT format, push to display

            b = sdbuffer[buffidx++];

            g = sdbuffer[buffidx++];

            r = sdbuffer[buffidx++];

            tft.pushColor(tft.color565(r,g,b));

          } // end pixel

        } // end scanline
		tft.endWrite();
       
	    Serial.print(F("Loaded in "));

        Serial.print(millis() - startTime);

        Serial.println(" ms");

      } 

    }

  }


  bmpFile.close();

  if(!goodBmp) Serial.println(F("BMP format not recognized."));

}












void runCore1 ()
{
  s1.acquire();

	while (true) {

 bmpDraw("img/TEST.bmp", 0, 10);
 
				}
 s2.release();
 }
 
 void setup() {
	  tft.initR(INITR_BLACKTAB); 
  Serial.println(F("Initialized"));
  tft.fillScreen(ST77XX_BLACK);

  tft.setRotation(3);
  
   t2.start(mbed::callback(runCore1)); //тут отображается нормально

		delay(3000);
		
		tft.setFont(&TIMES8pt8b); 
  tft.setTextColor(ST7735_WHITE);
  
  
/* А вот тут зависает и Pico начинает мигать зеленым светодиодом*/
  tft.setCursor(40, 15);  
  tft.println(utf8cyr("Print TEST"));
  
  bmpDraw("img/TEST2.bmp", 40, 20);
	 
	 
 }

Подскажите плиииз, что может быть не так и как правильно реализовать вывод на экран в разных потоках? Спасибо!

mixail844
Offline
Зарегистрирован: 30.04.2012

семафор(semaphore) , мьютекс(mutex)