Функция работает с arm-gcc, но не с Keil - PullRequest
0 голосов
/ 06 октября 2018

Я перешел к разработке встраиваемых систем с использованием STM32 и недавно начал пытаться использовать Keil вместо моего взломанного процесса для использования gcc / st-util (поскольку для переноса кода на устройство требуется меньше шагов, простая отладка и т. Д.),Во всяком случае, я делал раннюю попытку функции, которая записывает строку на маленький 1,8-дюймовый TFT-экран (это было упражнение в книге Джеффери Брауна), и кажется, что это сработает, если я скомпилирую его, используя gcc, но не с Keil. Я получаюощущение, что я должен делать что-то, что не соответствует стандарту C, или в компиляторе Keil есть идиосинкразия, о которой я не знаю.

Я уверен, что есть много возможностей для улучшения, но моя текущая проблема заключается в том, что array никогда не обновляется, это кажется пустым массивом, когда он собирается записать фактические данные на экран. Я пробовал несколько вещей (используя malloc, переставляя, где он обновляется) но это всегда одно и то же, я вижу, как процесс достигает строки, в которой он устанавливает color в следующем значении массива, но это значение не появляется в array. Есть идеи?

Код:

void ST7735_WriteString(uint8_t *c, uint16_t size, uint16_t fgColor, uint16_t bgColor)
{
  uint8_t i = 0;
  // How many chars fit across
  uint8_t needAnotherLine = 1;
  uint16_t currentPosition = 0;
  uint8_t currentLine = 0;
  uint16_t boxesLeft = size - currentPosition;
  uint16_t arraySize;

  while (needAnotherLine)
  {
    uint16_t boxesThisRow = 0;
    if (boxesLeft > 25)
    {
      needAnotherLine = 1;
      boxesThisRow = 25;
    }
    else
    {
      needAnotherLine = 0;
      boxesThisRow = boxesLeft;
    }

    // Initialize array which holds the pixel-color data for the row
    arraySize = 66 * boxesThisRow;
    uint16_t array[arraySize];

    // Set new box for line
    ST7735_setAddrWindow(110 - 10 * currentLine, 6, 120 - 10 * currentLine, 6 + 6 * boxesThisRow, 0x6);
    for (i = 0; i < boxesThisRow; i++)
    {
            int8_t k = 0, j = 0;
            uint16_t line;  // font column
            uint8_t bit;    // foreground or background?
            uint16_t color; // which color to draw

            for (k = 0; k < 6; k++)
            {
                line = (k < 5) ? ASCII[5 * (*c++) + k] : 0; // 7-bit bitmap
                for (j = 10; j >= 0; j--)
                {
                    // Get bit values
                    bit = (line >> j) & 1;
                    color = bit ? fgColor : bgColor;
                    array[10 - j + k * 11 + i * 66] = color;
                }
            }
    }
    LcdWrite16(LCD_D, array, 66 * boxesThisRow);
    currentPosition += boxesThisRow;
    boxesLeft -= boxesThisRow;
    currentLine++;
  }
}
...