Fortsätt till huvudinnehåll

Inlägg

Visar inlägg från 2012

New Codility Challenge

A new Codility challenge (codename Tau) has been launched. I had a quick look at it just now but am way too tired to give it a go. Feel free to beat me to it! It involves a torus represented as a vector of vectors. Go for the gold at http://www.codility.com (click on the "Certify yourself" button).

googletest under Eclipse

At work I often tell my fellow engineers that Test Driven Development, TDD, is the  way to go! Sadly I have to confess that I havn't had a decent test framework installed at my development PC at home...until now! I just got googletest, the Google C++ Testing Framework up and running under Eclipse CDT. So how do you do that? Check comment 9 here:  http://code.google.com/p/googletest/issues/detail?id=40 And read the README that comes with googletest on how to build the lib. Ask if you need some guidelines.

Corsair Force 3 SSD

Just recently bought and installed my first solid state drive (SSD). After having evaluated it for a couple of days I can say it is the breath of fresh air that my PC needed. The only bumps on the road so far has been Windows failing to install >100 updates in one shot, had to split them into smaller portions. Well can't really blame the SSD for that. Second bump was trying to enable AHCI after  Windows 7 was already installed. This made Windows unhappy and didn't wish to boot at all. One quick search on Google solved that one. More on AHCI can be found on Wikipedia:  http://en.wikipedia.org/wiki/Advanced_Host_Controller_Interface Microsoft fix for enabling AHCI in Windows 7 after it has been installed:  http://support.microsoft.com/kb/922976

Override a function from a third party library, is it possible?

I recently conducted a small experiment where I tried to override a single function from a third party library that we use. The reason for doing this is that I wanted to use a customized version of the function in my testbench and I didn't want to add preprocessor directives to the application code to use different versions if compiling for testbench or not. Unfortunally I must say I failed. At first I just tried to add a function with the same name and input params to the same namespace. Didn't have any high hopes that it would work, and of course it didn't. The linker had no idea what to do when it found two identical functions so it just exited with an error. Next I thought about writing a stubbed version of the entire lib. Not a bright idea either. The lib is very extensive and stubbing every function would take forever and would leave me with a testbench that really doesn't test the functionality at all. Finally I turned to my old friend Google. First I thoug

Codility sigma2012

Just scored 100% on the new cert task on Codility. Won't give you the solution just yet :). Certificate is here:  http://codility.com/cert/view/certZJHZPQ-S4MJ88Z7C9YEC4ED Might look a bit odd that I completed the task in 1 min but it was my second attempt so I already had the code prepared. Like a tv chef!

Embedded development questions part II

I present to you, this piece of code: bool keyPressed = false; void interruptServiceRoutine() {   keyPressed = true; } int main() {   for (;;)   {     while (!keyPressed);     std::cout << "A key was pressed!";   }   return 0; } Take a minute to think about what's wrong with the code above. Ready? Ok, here are the things I came to think of during my job interview. keyPressed  is set to true in the ISR. But never (re)set to false anywhere. keyPressed  should be volatile  to ensure the compiler does not optimize it. There is a risk for key bounce  which may result in several interrupts per key press. To solve 1 and 2 the code can be modified to look like this: volatile bool keyPressed = false; void interruptServiceRoutine() {   keyPressed = true; } int main() {   for (;;)   {     while (!keyPressed);     std::cout << "A key was pressed!";     keyPressed = false;   }

Embedded development questions part I

Let me just hit you with this. Check this code: const char* aChar_p = "Hello"; // (1) (2) bool aBoolean; // (3) int main() {   int i = 0; // (4)   bool flag = true; // (5)   return 0; } Now answer this. Where in memory will (1) be stored? What about (2), and (3), and (4), and (5)? This was another question I was faced with during my recent job interview. To be honest, I have never needed to care much about linker files and memory layout. In every project I have been in these things have already been set up long before I've entered the scene. With that said, I think it's still good knowledge to have, so let's go trough them one by one. Variables defined at this (top) level are called global. They are accessible from anywhere in the code and has a lifespan that stretches over the entire program execution. You would say it is a static variable. Since the variable is static, you might think that adding the static  keyword won't make any difference

Codility tasks - Part II

Now, the second codility task I was faced with was a bit tougher. The goal was to create a function that, given a vector of integers A and an integer K, returned the number of integer pairs in the vector that, when added, sums up to K. Let me give you an example. Assume that you are given a vector A = [0, -1, 3, 2, -5, 7] and K = 2. Possible combinations to get K are (0, 2), (-1, 3), (3, -1), (2, 0),  (-5, 7), and (7, -5). In other words, the function should return 6. Now, how did I solve this task? The first solution that came to mind involved nested for-loops. The outer loop picking one integer at the time from the vector and the inner loop adding the integer to the others one by one to see if the result is K. This solution works, but it does not scale well. Time complexity will be O(N**2) ,   something that for large vectors will result in very long execution times. My second approach was to use my old friend, the integer counter, and count all occurences of each integer in th

Codility tasks - Part I

I was recently faced with two codility tasks when applying for a job as an Embedded Software Engineer. For those of you who arn't familiar with Codility you can check out their website here:  www.codility.com Task one - Dominator The first task was called Dominator. The goal was to, given a std::vector of integers, find an integer that occurs in more than half of the positions in the vector. If no dominator was found -1 should be returned. My approach was to loop through the vector from the first to the last element, using a std::map to count the number of occurences of each integer. If the count ever reached above half the size of the vector I stopped and returned that integer and if I reached the end without finding a dominator I returned -1. So was that a good approach? Well, the reviewer at the company rated the solution as 'pretty ok'. His preferred solution was store the first integer in the array and set a counter to 1. Then loop through the remaining i