Jump to content

UGFX+ ecos os


artem_dmitriev

Recommended Posts

Hello. I am trying to use ugfx with ecos os on custom board based on stm32f429 controller . I've tried to run examples from GDISP directory,and all works fine.

But when i try to run examples from GWIN an exception happends. I use my own touch driver, but the problem is not in it. Did anybody try to use ecos with ugfx?

Link to comment
Share on other sites

For example, i am trying to run GWIN/slider example. Here is the code from main.c

#include "gfx.h"

static GListener gl;
static GHandle ghSlider1, ghSlider2, ghConsole;

static void createWidgets(void) {
GWidgetInit wi;

// Apply some default values for GWIN
gwinWidgetClearInit(&wi);
wi.g.show = TRUE;

// create Slider1
wi.g.y = 10; wi.g.x = 10; wi.g.width = gdispGetWidth()-20; wi.g.height = 20; wi.text = "S1";
ghSlider1 = gwinSliderCreate(0, &wi);

// create Slider2
wi.g.y = 40; wi.g.x = 10; wi.g.width = 20; wi.g.height = gdispGetHeight() - 50; wi.text = "S2";
ghSlider2 = gwinSliderCreate(0, &wi);

// Set slider 2 to return extended events
gwinSliderSendExtendedEvents(ghSlider2, TRUE);

// Some options to try
//gwinSliderSetRange(ghSlider1, 0, 70000);
//gwinSliderSetRange(ghSlider2, -4, 4);
//gwinSliderSetRange(ghSlider1, 4, -4);

// Console to display slider events
wi.g.y = 40; wi.g.x = 40; wi.g.width = gdispGetWidth()-50; wi.g.height = gdispGetHeight()-50;
ghConsole = gwinConsoleCreate(0, &wi.g);
}

void cyg_user_start(void){

GEventGWinSlider * pe;
const char * sAction;

// Initialize the display
gfxInit();

// Set the widget defaults
gwinSetDefaultFont(gdispOpenFont("UI2"));
gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE);
gdispClear(White);

// create the widget
createWidgets();
gwinSetColor(ghConsole, Green);
gwinSetBgColor(ghConsole, White);
gwinClear(ghConsole);

// We want to listen for widget events
geventListenerInit(&gl);
gwinAttachListener(&gl);

while(1) {
// Get an Event (assume it is a slider event)
pe = (GEventGWinSlider *)geventEventWait(&gl, TIME_INFINITE);

switch(pe->type) {
case GEVENT_GWIN_SLIDER:
switch(pe->action) {
case GSLIDER_EVENT_SET: sAction = "SET"; break;
case GSLIDER_EVENT_CANCEL: sAction = "CANCEL"; break;
case GSLIDER_EVENT_MOVE: sAction = "MOVE"; break;
case GSLIDER_EVENT_START: sAction = "START"; break;
default: sAction = "????"; break;
}
gwinPrintf(ghConsole, "Slider %s = %d %s\n", gwinGetText(pe->gwin), pe->position, sAction);
break;

default:
// Oops - not a slider event.
break;
}
}
}

The program can't reach "switch(pe->type)" line. When i suspend debug session, i see, that an exception occured. For example, the program reach "cyg_posix_exception_handler" with exception number 3. I also noticed that exception occured on line 109 in file packages/kernel/current/src/sync/cnt_sem.cxx

        // Allow other threads to run
Cyg_Scheduler::reschedule();

Maybe i should run ugfx from thread?

Link to comment
Share on other sites

I didn't have that problem when I was tinkering with it but that was a while ago now.

It looks like the ecos scheduler has not been initialised or something similar. Perhaps you can provide more back trace information so we can see the call hierarchy at the point of the exception.

Link to comment
Share on other sites

Is it necessary to call cyg_scheduler_start before gfxInit ? I call gfxInit in cyg_user_start,but cyg_sheduler_start is called after that now.

void
cyg_start( void )
{
CYG_REPORT_FUNCTION();
CYG_REPORT_FUNCARGVOID();

cyg_prestart();

cyg_package_start();

cyg_user_start();

#ifdef CYGPKG_KERNEL
Cyg_Scheduler::start();
#endif


CYG_REPORT_RETURN();
} // cyg_start()

When i try to call cyg_scheduler_start before gfxInit, the program doesn't reach gfxInit().

Link to comment
Share on other sites

I am hazy on the ecos details, it was a quite a while ago.

The scheduler definitely needs to be started first before calling gfxinit. The details on how to do that I have forgotten.

Essentially ugfx runs as a user thread once the scheduler is started as ugfx needs the multi-threading capabilities of ecos which are not available until the scheduler is started.

Link to comment
Share on other sites

There is a difference between the two. From memory it is something to do with the runtime environment. A quick Google search should show you the difference.

I do know however that the arm "none" compiler is the one you should be using for any embedded work.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...