Thursday, 24 December 2009

Merry Christmas

Hi folks,

I’d like to wish all of you a Merry Christmas and a Happy New Year, also on behalf of our entire team! Hopefully you get to spend some quiet, peaceful time with your loved ones.

Of course we will continue to post interesting and helpful news from the world of Windows Embedded here on our blog in 2010.

Meanwhile, if there are any topics that your would like to discuss further or that you think that are missing on our blog, please let me know so in the comment section!

Again, Happy Holidays to you all!
Read more! Post this to a friend!

Wednesday, 23 December 2009

Season Greetings and a small Quiz

I guess it's time to wish all our readers and followers a very Merry Christmas and a Happy and Prosperous New Year 2010!

As this is the Season of Giving we thought we would give away some Windows CE 6.0 books. For free? Well, we thought we would do a small quiz and then draw 5 Winners from those readers who get all answers right.

So have fun with the quiz, have yourselfs a nice and quiet Christmas and a really loud New Year!

Simply send the answers to our EMail Adress and we will let you know if you are one of the lucky winners! Btw: You can find (nearly) all answers in this Blog.

1) What is the name of the missing symbol by the following error message "Error: Can't find import 2508 in coredll.dll".
2) What is the recommended size for the (MTU = maximum transmission unit) while using PB KITL debugger?
3) What was the codname of Microsoft Auto 4.0 RTM?
4) In which country is the Microsofts Student Technology Competition "Imagine Cup 2010" going to be hosted?
5) With which Version of Windows CE did Microsoft start to use Whiskeys as code names?
6) Which define is required (in the sources file) to get the wMMX2 instruction set for your XScale processor in your assembler code?
7) From which book is "So long and thanks for all the fish!" and who said it?

So long and thanks for all the fish!
Read more! Post this to a friend!

Friday, 18 December 2009

"Snowing" news from Nürnberg ...

to all Windows Embedded developers!!! :)

and I hope that you have also nice weather like us here in Nürnberg. If not I recommend you to visit the "Christkindlesmarkt" at Nürnbergs downtown. Just have fun!
Read more! Post this to a friend!

Wednesday, 16 December 2009

Use previous Windows Embedded CE 6.0 Rx install for your next project

Using your previous Windows Embedded CE 6.0 Rx install for your next project should actually be a valid use case. But as a feedback from yesterdays post in this blog I got a phone call from one of my colleagues asking: "Look: Half of my development team has build problems after installing the new BSP in our new project. Any idea?"

I remembered the Peanuts comics, smiled and said: "The doctor is in! So tell me..."

Doing a blddemo -q build errors occur stating error C2677: Undefined assembler operation. The current build directory is c:\wince600\platform\common\src\soc\....blabla...

So what's happening here?

error C2677 is a MIPS Error Message. The directory above is listing the SOC (System On Chip) designs supported by all installed BSPs. Inside that directory we identified BSP support for various SOCs. These causing the problems and used in previous projects were Freescale's iMX27, iMX31, and iMX35. And these are non MIPS but ARM core SOC designs. And surely the selected MIPS assembler does not know how to handle ARM assembler operations.

So I suggested to deinstall these iMX BSPs which would surely solve the build problem. But that's not a valid solution if you still have to support the old project.

2nd proposal is to introduce some logic checking an environment variable defining the CPU or SOC (TGTCPU) selected for the current build in the C:\WINCE600\PLATFORM\COMMON\SRC\SOC\dirs until now stating to traverse all subdirectories (DIRS=*). But that's most likely causing maintenance issues on this file for upcoming BSP installs or removals that have to be solved manually even if these BSPs do not have the drawbacks from Freescales BSPs mentioned.

So how and where do other BSPs control if they are MIPS or ARM or whatever?

Well, directly in the sources files inside the subdirectories below C:\WINCE600\PLATFORM\COMMON\SRC\SOC\. Inside these sources files you can use NOMIPS16CODE=1 or identify ARM assembler sources by ARM_SOURCES= foobar.s ...

So you can add this type of control where needed in the sources files of the iMX BSPs coming from Freescale. Surprisingly this takes just a few minor changes.

Surely it would be nice if Freescale would solve these build issues directly in their BSPs to improve such compatibility issues in multi platform scenarios with different target CPU cores.

So much for project hopping from Freescale iMX (ARM core) to MIPS II FP. You mean I have not explained how this is solved in x86 or SH? Correct! I haven't... But there always has to be some magic left over. Especially at this time of the year...

-- Oliver Merkel

"Christmas waves a magic wand over this world, and behold, everything is softer and more beautiful." --N. V. Peale

Read more! Post this to a friend!

Windows Embedded CE: touch considerations part II

Hi Folks,

in my last post I talked about improving the touch driver by replacing the timer (SYSINTR_TOUCH_CHANGED) with a Sleep(). Today I want to point out another touch driver improvement.

When using the touch screen the CPU utilization increases dramatically, this of course results in a much worse system performance. After some research and some measurements you will find, that the increase in CPU utilization is mainly caused by busy waits which are used frequently throughout the touch driver (e.g. XllpOstDelayMicroSeconds() in Mainstone BSPs).

Replacing the busy waits with Sleep() will solve this problem while still keeping your touch driver responsive enough.

Have fun!
Read more! Post this to a friend!

Tuesday, 15 December 2009

Windows CE Chat Transcript

If you were hoping to find the chat transcript from the December Windows CE Chat, I'm afraid I have to tell you that it did not take place - I wonder if the CE Team will be there next week :-)

So long and thanks for all the fish!

Read more! Post this to a friend!

CommCtrl with R3 Touch broken after QFE update (Fatal error U1077)

A while ago Jochen already posted some info on Touch Gestures feature introduced in R3. So if this is coming along with Windows CE 6.0 R3 then there must be a situation to mess up things from R2 and R3.

And here it is:

Get the R3 iso image from Microsoft download center. Nearly 1.2 GB of data. But at least if that stuff in your installation gets broken you get all data to do a repair then.

Run R3 update being an incremental install to an existing Windows CE 6.0 R2 and voilá: It's working.

Now we learned one thing: Update everything to have the latest changes available! So get the QFEs!

But be aware: This might break your R3 install. If you have already done so then each blddemo will run into the following situation. Your build.log will show a fatal error:

commctrl.lib(aygutils.obj) : warning LNK4217: locally defined symbol SHCreateDefaultGradient imported in function "public: static int __cdecl AygUtils_t::SHGradientInit(struct tagSHGRADIENT *,int,unsigned short const *)" (?SHGradientInit@AygUtils_t@@SAHPAUtagSHGRADIENT@@HPBG@Z)
commctrl.lib(aygutils.obj) : warning LNK4217: locally defined symbol SHGetSystemMetrics imported in function "public: static int __cdecl AygUtils_t::SHGradientInit(struct tagSHGRADIENT *,int,unsigned short const *)" (?SHGradientInit@AygUtils_t@@SAHPAUtagSHGRADIENT@@HPBG@Z)
commctrl.lib(lvgesture.obj) : error LNK2019: unresolved external symbol "public: static void __cdecl TouchPerf::ReleaseSession(void)" (?ReleaseSession@TouchPerf@@SAXXZ) referenced in function "public: __cdecl GestureTriggeredScrollCtrl::~GestureTriggeredScrollCtrl(void)" (??1GestureTriggeredScrollCtrl@@QAA@XZ)
commctrl.lib(lvgesture.obj) : error LNK2019: unresolved external symbol "public: static void __cdecl TouchPerf::AcquireSession(void)" (?AcquireSession@TouchPerf@@SAXXZ) referenced in function "public: __cdecl GestureTriggeredScrollCtrl::GestureTriggeredScrollCtrl(void)" (??0GestureTriggeredScrollCtrl@@QAA@XZ)
C:\WinCE600\OSDesigns\???_MIPSII_FP\cesysgen\oak\target\MIPSII_FP\debug\commctrl.dll : fatal error LNK1120: 2 unresolved externals
NMAKE : fatal error U1077: 'link' : return code '0x460'
NMAKE : fatal error U1077: 'C:\WINCE600\sdk\bin\i386\nmake.exe' : return code '0x2'

This one can not be resolved with turning on/off catalog item selections or something like that. The current QFEs simply break your R3 install and overwrite some files but not all being related to Touch Gesture or other R3 features.

This will most likely be fixed in the upcoming QFEs again but meanwhile just re-run the R3 rollout msi (Microsoft Installer) included in the ISO image and select repair from the corresponding menu.

Until now I did not encounter any side effects after using this R3 repair.

Unfortunately it's hard to say if the R2 tree is completely merged in R3 or if some side effect might occur. If I find some time I will check that. But most likely best way is to wait for the next QFEs to get that properly fixed.

At least the repair will allow you to continue work on R3 development that way.

Merry Christmas and Best Wishes for a happy new year, and all your R2 and R3 projects...

--- Oliver
Read more! Post this to a friend!

Switching target OS from project to project

Ho ho ho and joyous Season Greetings,

from time to time I come across the situation to help out in projects with different Operating Systems. And guess what... sometimes one of the Operating Systems is a Microsoft Windows CE / Windows Mobile / MS Auto etc. Now assume that first such a switch of the target OS from one project to the other is happening and that second it is most likely that both Operating Systems are mainly developed in C/C++.

So we have compilers, linkers and other parts of the tool chain including make tool, etc. Thus we all (including you) run into issues that the environment variables of the development host have most likely the same naming even if we switch the compilers, linkers, etc.

You probably just came across such a situation if e.g. the Visual Studio Platform Builder Plugin for Windows CE 6.0 Rx behaves like that:

Starting Build: blddemo -q

Some output in Build Output window during sysgen phase but less than expected... There were build errors and build.log just says

Starting sysgen phase for project ( common )
Found localized resources for Languages ( 0404 0407 0409 040C 0410 0411 0412 0413 0416 0419 041D 0804 0C0A)

Microsoft (R) Program Maintenance Utility Version CE-6.00.1893.0
Copyright (C) Microsoft Corporation. All rights reserved.

NMAKE : fatal error U1065: invalid option '-'
Windows CE Version (Release) (Built on Jun 30 2006 16:52:46)

So what can possibly go wrong at that early build phase? If this is correlated to the same reason I am thinking of then this will happen in all your BSP building solutions yet.

The failure results from an nmake sysgen invoked in C:\WINCE600\PUBLIC\COMMON\CESYSGEN. Having a short look into the makefile reveals that from included cesysgen.mak the rules preproc and postproc described in makefile should be executed.

But where's this !"§$ option of that nmake error message above coming from? You never set that option?

On build console (build window) do a set MAKE. Probably you get something like:


This could have been set up by other build environments and is normally or most likely not used in a Windows CE / Windows Mobile environment. If you clearly identify this to belong to some other target operating system than Windows CE / Windows Mobile and it is not used right now then remove this environment variable and run your build command again.

blddemo -q

This is most likely doing the trick...

To wish you the special gifts of this holiday season - Peace, Joy, Lasting Happiness and a working tool chain to build your favorite OS.

-- Oliver
Read more! Post this to a friend!

Monday, 14 December 2009

Windows Embedded CE touch driver consideration

Hi folks,

As you might have noticed, the Windows Embedded CE touch driver uses TWO interrupts. One interrupt (SYSINTR_TOUCH) to wait for the user to touch the screen, while the other interrupt is a timer (SYSINTR_TOUCH_CHANGED). Upon its expiration the touch driver determines if the touch is still pressed, if so the coordinates are measured and the timer is reset; if not the touch driver switches back to the first interrupt to wait for the user to press the screen.

This is a relict from Windows CE versions prior to 3.0 when the systemtick was still 20ms. Hence the systemtick was too long to be used as a timer for the touch screen.

However, this implementation sometimes leads to unexplainable behavior/errors due to the fact that interrupt events are queued differently in your system then regular events. An interrupt service thread (IST) should therefore only consist of ONE (and only ONE) WaitForSingleObject() as well as ONE (and only ONE) InterruptDone()! Unfortunately this implementation uses TWO WaitForSingleObject() calls in its IST!

On top of that, it also utilized unnecessary resources namely the extra timer.

An elegant solution would be to get rid of the extra timer and use a Sleep() in its stead:

static ULONG TouchPanelpISR(PVOID Reserved)

static BOOL fStartIST = TRUE;







Sleep(5); // use appropriate value here




// don't call InterruptDone the first time

// as this is done by InterruptInitialize

if (!fStartIST)


InterruptDone( gIntrTouch );





fStartIST = FALSE;


WaitForSingleObject( hTouchPanelEvent, gdwTouchIstTimeout );






Stay tuned for part II!

Have Fun!
Read more! Post this to a friend!

Friday, 11 December 2009

LAST Microsoft Windows Embedded CE! Live chat –> in this year :)

MS is hosting a live chat about Windows Embedded CE. Do you have tough technical questions regarding Windows Embedded CE for which you're seeking answers? Then join the upcomming chat!

This is a great opportunity to chat with members of the Windows CE development team and give us a great opportunity to communicate with MS and ask questions about development issues.

So don't forget to put the date in your schedule and join it.

Title: Windows Embedded CE Live Chat!
Date: Tuesday, December 15, 2008 18:00 - 19:00 CET

To join this chat, please log on via the main MSDN chat page at:

Have fun!

Read more! Post this to a friend!

Thursday, 10 December 2009

Windows CE QFEs for month of November 2009 arrived

the latest Windows CE updates have been recently released and are available for download (the Download Site is up-to-date :) ) .
Some issues (especially the compiler fix for Windows CE 6.0) have been resolved, no time to loose and get them now! More information for each update is provided in the Readme document available after the individual update(s) has been installed.

Windows CE 5.0 Monthly Update (November 2009)

Follow this link and download the set of updates for Windows CE 5.0 released during the period of November 1 - November 30, 2009.

Fixes made in this update:

Component: COMM

  • 091123_KB974907 - Closing sockets may cause exceptions in some processes such as device.exe or the TCP/IP

Windows CE 6.0 Monthly Update (November 2009)

Follow this link and download the set of updates for Download this set of updates for Windows Embedded CE 6.0 R3 environment.

Component: Compilers

  • 091130_KB950561 - Compiler may incorrectly issue C4819 warning about invalid multi byte characters.

Component: FSD

Component: Menu

  • 091113_KB977404 - This update addresses the issue with the main Menu item not getting highlighted when selected.

Component: .NET CF 2.0 SP2

Component: Pictor

  • 091118_KB977315 - This update addresses the issue with the scroll bar that may occur when connecting to Windows Embedded CE 6.0 device from desktop computer using Network Projector.

Component: SQLCE

Component: WININET

  • 091130_KB975804 - Updated files: The system may get slow when using the WinInet APIs to download files from network.

Keep your OS up to date!

Read more! Post this to a friend!

Monday, 7 December 2009

Missing Wince 5.0 QFE Link for October 2009

Hello guys,

Unfortunately Microsoft seems still to have problems with updating their Download Site, but there is a very important quickfix for all (Wince 5.0) ATL users in the october update:

A memory leak may occur when calling IDispatch::Invoke(). The file(s) with the new source code changes for this component can be found in the directory %_WINCEROOT%\:

Download this set of updates for Windows CE 5.0 released during the period of October 1 - October 31, 2009.

You can find the October 2009 Update here.

Keep your OS up to date!

Read more! Post this to a friend!

EB delivers Satellite-Terrestrial Smartphones

If you have been following our blog you may have read the different posts around Terrestar's project for a Sattelite-Terrestrial Service. The last news around this was during the middle of this year when Terrestar successfully deployed a satellite allowing the first calls to be made (read and watch here).

As of next year "EB will be responsible for delivering complete products to TerreStar based on the EB-designed satellite-terrestrial reference device" running Windows Mobile® 6.5.

Read the full news here and here.

So long and thanks for all the fish!
Read more! Post this to a friend!

Friday, 4 December 2009

What's wrong with the KITL_RETAILMSG() output?

When you setup a new BSP, your first challage will be getting KITL to work.
Some debug outputs might be helpful. But some of the KITL_RETAILMSG() "%" outputs are wrong and therefore will not appear on your terminal.
A look at the source code reveals the truth;
KITLOutputDebugString() doesn't support all the printf() format placeholders:

* @func void | KITLOutputDebugString | Simple formatted debug output string routine
* @rdesc none
* @parm LPCSTR | sz,... |
* Format String:
* @flag Format string | type
* @flag u | unsigned
* @flag d | int
* @flag c | char
* @flag s | string
* @flag x | 4-bit hex number
* @flag B | 8-bit hex number
* @flag H | 16-bit hex number
* @flag X | 32-bit hex number

Replace e.g. "%08x" by "%X" and the numbers are fine!

Tschüß Holger
Read more! Post this to a friend!

Thursday, 3 December 2009

Embedded Software Engineering Kongress 2009 vom 08. – 10.12.2009 in Sindelfingen

Hallo zusammen,

es ist mal wieder so weit: vom 08. bis zum 10. Dezember 2009 findet der ESE Kongress in Sindelfingen statt. Mit 90 Fachvorträgen und 10 Kompaktseminaren aus Entwicklung, Forschung, Lehre und Management bietet der ESE Kongress reichlich Stoff für neue Ideen, Lösungswege und angeregte Diskussionen.

In diesem Rahmen werde ich am 10. Dezember um 9:45 einen Vortrag zum Thema: „Einsichten in die Entwicklung mit Windows Embedded CE 6.0 R3“ halten. Darin werde ich unter anderem die für Embedded Lösungen so wichtige Real-Time Fähigkeit von Windows Embedded CE erörtern. Außerdem werde ich auf dem Stand von Microsoft anzutreffen sein.

Ich hoffe Sie sind neugierig geworden. Lassen Sie mich in den Kommentaren einfach wissen, ob Sie mich auf dem ESE Kongress treffen möchten um über Windows Embedded oder sonstige Themen zu reden. Ich freue mich auf Sie!

Have fun!
Read more! Post this to a friend!

Tuesday, 1 December 2009

Bit Twiddling for Dummies

Ever been annoyed by number conversion?

May be it's time to look at this tiny tool. During the last years it has evolved from a simple hex-dec converter to a quite powerful gadget. And depart from cooking and dishwashing you can use it for your everyday twiddling.

Here are some screen shots:

You can select a file which describes bits of a 32 bit value. The list view at the right side shows the status of the bits or bit masks.

Load a identifier-value list (here "VK_xx.lst") and simply select one of the defined values in the drop down list below. The value controls will be updated immediately - naturally

Convinced? You can download a setup executable or the standalone executable from


BitFummler, Download bei heise

Oh, something I forgot to mention (one of my colleagues uses BitTwiddler since 2003 and didn't know :-) : In the bottom edit control you can enter c-like syntax, with variables 'a'-'z' where 'x' is the currently displayed value. The c-parser supports for/while/if/else statement, all c (?) operators (except pre-increment/-decrement etc.).

And if you want to monitor a value displayed in another applications control window just click the "Monitor" button and move the top of the arrow to the control.

Try it and have fun :-)

Read more! Post this to a friend!