Display the stack dump partially on the bottom screen when handling an exception
This commit is contained in:
parent
e0b5539b91
commit
50e5c29b1c
@ -32,6 +32,8 @@
|
|||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
|
||||||
|
static bool bottomScreenSelected = false;
|
||||||
|
|
||||||
bool loadSplash(void)
|
bool loadSplash(void)
|
||||||
{
|
{
|
||||||
//Don't delay boot nor init the screens if no splash image is on the SD
|
//Don't delay boot nor init the screens if no splash image is on the SD
|
||||||
@ -48,9 +50,14 @@ bool loadSplash(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void selectScreen(bool isBottomScreen)
|
||||||
|
{
|
||||||
|
bottomScreenSelected = isBottomScreen;
|
||||||
|
}
|
||||||
|
|
||||||
void drawCharacter(char character, int posX, int posY, u32 color)
|
void drawCharacter(char character, int posX, int posY, u32 color)
|
||||||
{
|
{
|
||||||
u8 *const select = fb->top_left;
|
u8 *const select = (bottomScreenSelected) ? fb->bottom : fb->top_left;
|
||||||
|
|
||||||
for(int y = 0; y < 8; y++)
|
for(int y = 0; y < 8; y++)
|
||||||
{
|
{
|
||||||
@ -59,7 +66,7 @@ void drawCharacter(char character, int posX, int posY, u32 color)
|
|||||||
for(int x = 7; x >= 0; x--)
|
for(int x = 7; x >= 0; x--)
|
||||||
if ((charPos >> x) & 1)
|
if ((charPos >> x) & 1)
|
||||||
{
|
{
|
||||||
int screenPos = (posX * SCREEN_TOP_HEIGHT * 3 + (SCREEN_TOP_HEIGHT - y - posY - 1) * 3) + (7 - x) * 3 * SCREEN_TOP_HEIGHT;
|
int screenPos = (posX * SCREEN_HEIGHT * 3 + (SCREEN_HEIGHT - y - posY - 1) * 3) + (7 - x) * 3 * SCREEN_HEIGHT;
|
||||||
|
|
||||||
select[screenPos] = color >> 16;
|
select[screenPos] = color >> 16;
|
||||||
select[screenPos + 1] = color >> 8;
|
select[screenPos + 1] = color >> 8;
|
||||||
@ -78,7 +85,7 @@ int drawString(const char *string, int posX, int posY, u32 color)
|
|||||||
line_i = 0;
|
line_i = 0;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else if(line_i >= (SCREEN_TOP_WIDTH - posX) / SPACING_X)
|
else if(line_i >= ((bottomScreenSelected ? SCREEN_BOTTOM_WIDTH : SCREEN_TOP_WIDTH)- posX) / SPACING_X)
|
||||||
{
|
{
|
||||||
// Make sure we never get out of the screen.
|
// Make sure we never get out of the screen.
|
||||||
posY += SPACING_Y;
|
posY += SPACING_Y;
|
||||||
|
@ -30,7 +30,8 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define SCREEN_TOP_WIDTH 400
|
#define SCREEN_TOP_WIDTH 400
|
||||||
#define SCREEN_TOP_HEIGHT 240
|
#define SCREEN_BOTTOM_WIDTH 320
|
||||||
|
#define SCREEN_HEIGHT 240
|
||||||
|
|
||||||
#define SPACING_Y 10
|
#define SPACING_Y 10
|
||||||
#define SPACING_X 8
|
#define SPACING_X 8
|
||||||
@ -42,5 +43,6 @@
|
|||||||
#define COLOR_YELLOW 0x00FFFF
|
#define COLOR_YELLOW 0x00FFFF
|
||||||
|
|
||||||
bool loadSplash(void);
|
bool loadSplash(void);
|
||||||
|
void selectScreen(bool isBottomScreen);
|
||||||
void drawCharacter(char character, int posX, int posY, u32 color);
|
void drawCharacter(char character, int posX, int posY, u32 color);
|
||||||
int drawString(const char *string, int posX, int posY, u32 color);
|
int drawString(const char *string, int posX, int posY, u32 color);
|
@ -140,13 +140,13 @@ void detectAndProcessExceptionDumps(void)
|
|||||||
for(u32 i = 0; i < 17; i += 2)
|
for(u32 i = 0; i < 17; i += 2)
|
||||||
{
|
{
|
||||||
posY = drawString(registerNames[i], 10, posY, COLOR_WHITE);
|
posY = drawString(registerNames[i], 10, posY, COLOR_WHITE);
|
||||||
hexItoa(regs[i], hexString);
|
hexItoa(regs[i], hexString, 8);
|
||||||
posY = drawString(hexString, 10 + 7 * SPACING_X, posY, COLOR_WHITE);
|
posY = drawString(hexString, 10 + 7 * SPACING_X, posY, COLOR_WHITE);
|
||||||
|
|
||||||
if(dumpHeader->processor != 9 || i != 16)
|
if(dumpHeader->processor != 9 || i != 16)
|
||||||
{
|
{
|
||||||
posY = drawString(registerNames[i + 1], 10 + 22 * SPACING_X, posY, COLOR_WHITE);
|
posY = drawString(registerNames[i + 1], 10 + 22 * SPACING_X, posY, COLOR_WHITE);
|
||||||
hexItoa(i == 16 ? regs[20] : regs[i + 1], hexString);
|
hexItoa(i == 16 ? regs[20] : regs[i + 1], hexString, 8);
|
||||||
posY = drawString(hexString, 10 + 29 * SPACING_X, posY, COLOR_WHITE);
|
posY = drawString(hexString, 10 + 29 * SPACING_X, posY, COLOR_WHITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,6 +162,28 @@ void detectAndProcessExceptionDumps(void)
|
|||||||
if(dumpHeader->processor != 9) posY -= SPACING_Y;
|
if(dumpHeader->processor != 9) posY -= SPACING_Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
selectScreen(true);
|
||||||
|
|
||||||
|
int posYBottom = drawString("Stack dump:", 10, 10, COLOR_WHITE) + 2 * SPACING_Y;
|
||||||
|
vu8 *stackDump = (vu8 *)dumpHeader + sizeof(ExceptionDumpHeader) + dumpHeader->registerDumpSize + dumpHeader->codeDumpSize + dumpHeader->stackDumpSize + dumpHeader->additionalDataSize;
|
||||||
|
u32 stackBytePos = 0;
|
||||||
|
for(u32 line = 0; line < 19 && stackBytePos < dumpHeader->stackDumpSize; line++)
|
||||||
|
{
|
||||||
|
hexItoa(regs[13] + 8 * line, hexString, 8);
|
||||||
|
drawString(hexString, 10, posYBottom, COLOR_WHITE);
|
||||||
|
drawCharacter(':', 10 + 8 * SPACING_X, posYBottom, COLOR_WHITE);
|
||||||
|
for(u32 i = 0; i < 8 && stackBytePos < dumpHeader->stackDumpSize; i++)
|
||||||
|
{
|
||||||
|
char byteString[] = "00";
|
||||||
|
hexItoa(*stackDump++, byteString, 2);
|
||||||
|
drawString(byteString, 10 + 10 * SPACING_X + 3 * i * SPACING_X, posYBottom, COLOR_WHITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
posYBottom += SPACING_Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectScreen(false);
|
||||||
|
|
||||||
u32 size = dumpHeader->totalSize;
|
u32 size = dumpHeader->totalSize;
|
||||||
char path[42];
|
char path[42];
|
||||||
char fileName[] = "crash_dump_00000000.dmp";
|
char fileName[] = "crash_dump_00000000.dmp";
|
||||||
|
@ -185,7 +185,7 @@ u32 firmRead(void *dest, u32 firmType)
|
|||||||
concatenateStrings(path, "/00000000.app");
|
concatenateStrings(path, "/00000000.app");
|
||||||
|
|
||||||
//Convert back the .app name from integer to array
|
//Convert back the .app name from integer to array
|
||||||
hexItoa(firmVersion, &path[35]);
|
hexItoa(firmVersion, &path[35], 8);
|
||||||
|
|
||||||
fileRead(dest, path);
|
fileRead(dest, path);
|
||||||
|
|
||||||
|
@ -40,16 +40,16 @@ void concatenateStrings(char *destination, const char *source)
|
|||||||
memcpy(&destination[j], source, i + 1);
|
memcpy(&destination[j], source, i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hexItoa(u32 number, char *out)
|
void hexItoa(u32 number, char *out, u32 nbDigits)
|
||||||
{
|
{
|
||||||
const char hexDigits[] = "0123456789ABCDEF";
|
const char hexDigits[] = "0123456789ABCDEF";
|
||||||
u32 i = 0;
|
u32 i = 0;
|
||||||
|
|
||||||
while(number > 0)
|
while(number > 0)
|
||||||
{
|
{
|
||||||
out[7 - i++] = hexDigits[number & 0xF];
|
out[nbDigits - 1 - i++] = hexDigits[number & 0xF];
|
||||||
number >>= 4;
|
number >>= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(; i < 8; i++) out[7 - i] = '0';
|
for(; i < nbDigits; i++) out[nbDigits - 1 - i] = '0';
|
||||||
}
|
}
|
@ -26,4 +26,4 @@
|
|||||||
|
|
||||||
int strlen(const char *string);
|
int strlen(const char *string);
|
||||||
void concatenateStrings(char *destination, const char *source);
|
void concatenateStrings(char *destination, const char *source);
|
||||||
void hexItoa(u32 number, char *out);
|
void hexItoa(u32 number, char *out, u32 nbDigits);
|
Reference in New Issue
Block a user