cancel
Showing results for 
Search instead for 
Did you mean: 

STemWin + FreeRTOS.

Peter Morrow
Associate II
Posted on April 06, 2018 at 15:05

Hello,

STeMwin version 540.

FreeRTOS version 9.0.1.

IAR EWARM 8.20.1

STM32F746NG with 32MB of external RAM.

I'm trying to use STemWin in a multi-task environment however I'm not getting very far.  I had actually been using the non RTOS version of the emWin library by mistake (STemWin540_CM7_ot_IAR.a) and it had been working fine with regards to drawing a UI on the screen, however when I came to update the UI from another RTOS task I noticed it didn't work and thus realised I wasn't using 

STemWin540_CM7_OS_ot_IAR.a.  Having now moved to the OS version of the library, I'm getting a hardfault on the most basic of emWin operations.  Switching back to the non OS library and eveything works again (except of course updating the UI from multiple threads).  The hardfaults all eminate from within the stmemWin library.

I have implemented the required functions for multi-tasking in GUI_X_OS.c:

/*********************************************************************

* SEGGER Microcontroller GmbH & Co. KG *

* Solutions for real time microcontroller applications *

**********************************************************************

* *

* (c) 1996 - 2017 SEGGER Microcontroller GmbH & Co. KG *

* *

* Internet: www.segger.com Support:

mailto:support@segger.com

*

* *

**********************************************************************

** emWin V5.40 - Graphical user interface for embedded applications **

All Intellectual Property rights in the Software belongs to SEGGER.

emWin is protected by international copyright laws. Knowledge of the

source code may not be used to write a similar product. This file may

only be used in accordance with the following terms:

The software has been licensed to STMicroelectronics International

N.V. a Dutch company with a Swiss branch and its headquarters in Plan-

les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the

purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_

troller products commercialized by Licensee only, sublicensed and dis_

tributed under the terms and conditions of the End User License Agree_

ment supplied by STMicroelectronics International N.V.

Full source code is available at: www.segger.com

We appreciate your understanding and fairness.

----------------------------------------------------------------------

File : GUI_X_OS.C

Purpose : This file provides emWin Interface with FreeRTOS

---------------------------END-OF-HEADER------------------------------

*/

/**

******************************************************************************

* @attention

*

* Licensed under MCD-ST Liberty SW License Agreement V2, (the 'License');

* You may not use this file except in compliance with the License.

* You may obtain a copy of the License at:

*

*

https://community.st.com/external-link.jspa?url=http%3A%2F%2Fwww.st.com%2Fsoftware_license_agreement_liberty_v2

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an 'AS IS' BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*

******************************************************************************

*/

/* Includes ------------------------------------------------------------------*/

#include 'GUI.h'

/* FreeRTOS include files */

#include 'cmsis_os.h'

/*********************************************************************

*

* Global data

*/

static osMutexId osMutex;

static osSemaphoreId osSemaphore;

/*********************************************************************

*

* Timing:

* GUI_X_GetTime()

* GUI_X_Delay(int)

Some timing dependent routines require a GetTime

and delay function. Default time unit (tick), normally is

1 ms.

*/

int GUI_X_GetTime(void)

{

return ((int) osKernelSysTick());

}

void GUI_X_Delay(int ms)

{

osDelay( ms );

}

/*********************************************************************

*

* GUI_X_Init()

*

* Note:

* GUI_X_Init() is called from GUI_Init is a possibility to init

* some hardware which needs to be up and running before the GUI.

* If not required, leave this routine blank.

*/

void GUI_X_Init(void) {

}

/*********************************************************************

*

* GUI_X_ExecIdle

*

* Note:

* Called if WM is in idle state

*/

void GUI_X_ExecIdle(void) {}

/*********************************************************************

*

* Multitasking:

*

* GUI_X_InitOS()

* GUI_X_GetTaskId()

* GUI_X_Lock()

* GUI_X_Unlock()

*

* Note:

* The following routines are required only if emWin is used in a

* true multi task environment, which means you have more than one

* thread using the emWin API.

* In this case the

* #define GUI_OS 1

* needs to be in GUIConf.h

*/

/* Init OS */

void GUI_X_InitOS(void)

{

/* Create Mutex lock */

osMutexDef(MUTEX);

/* Create the Mutex used by the two threads */

osMutex = osMutexCreate(osMutex(MUTEX));

/* Create Semaphore lock */

osSemaphoreDef(SEM);

/* Create the Semaphore used by the two threads */

osSemaphore= osSemaphoreCreate(osSemaphore(SEM), 1);

}

void GUI_X_Unlock(void)

{

osMutexRelease(osMutex);

}

void GUI_X_Lock(void)

{

osMutexWait(osMutex , osWaitForever) ;

}

/* Get Task handle */

U32 GUI_X_GetTaskId(void)

{

return ((U32) osThreadGetId());

}

void GUI_X_WaitEvent (void)

{

osSemaphoreWait(osSemaphore , osWaitForever) ;

}

void GUI_X_SignalEvent (void)

{

osMutexRelease(osSemaphore);

}

/*********************************************************************

*

* Logging: OS dependent

Note:

Logging is used in higher debug levels only. The typical target

build does not use logging and does therefor not require any of

the logging routines below. For a release build without logging

the routines below may be eliminated to save some space.

(If the linker is not function aware and eliminates unreferenced

functions automatically)

*/

void GUI_X_Log (const char *s) { }

void GUI_X_Warn (const char *s) { }

void GUI_X_ErrorOut(const char *s) { }

/*************************** End of file ****************************/

My stack sizes for all tasks look to be fine, I cannot see any issues with regards to running out of memory etc.  All LCD_ emWin functions are called in GUI_LOCK() and GUI_UNLOCK() blocks, so I think I'm doing the right thing.

Any ideas?

Let me know if there is any more information I can provide.

N.B. There is a multitask emWin example for the F746G disco board which does work - though I'm not able to spot anything obviously different between my code and theirs.

Peter.

1 REPLY 1
Peter Morrow
Associate II
Posted on April 06, 2018 at 19:19

Looks like we are having more success running emwin from internal ram instead of external ram.  Off to investigate external RAM timings now...

Peter.