/* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ChibiOS/RT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** * @page article_debug Debugging ChibiOS/RT applications * ChibiOS/RT offers several mechanisms that can help in the debug phase of * the development cycle. * *

What this guide does not cover

* This guide assumes knowledge in following areas: * - General knowledge of embedded development. * - RTOS concepts. * - Setup of your specific target hardware and toolchain. * - Knowledge of your toolchain. The guide will explain what you need to do, * not how it is done using you specific debugger, compiler, JTAG probe and * target hardware. * . *

Helpful debugging configuration settings

* There are several settings in your kernel configuration file * (see @ref templates/chconf.h) that you may want to enable during * debugging and in general during the whole development process. * - @p CH_OPTIMIZE_SPEED=FALSE, this disables inlining into the kernel code * and makes it easier to debug using your debugger, you may also want * to reduce or disable compiler optimizations (-O0 using GCC). * - @p CH_DBG_ENABLE_CHECKS=TRUE, this setting enables the checks on the * API parameters, useful to understand if you are passing wrong parameters * to the OS functions. * - @p CH_DBG_ENABLE_ASSERTS=TRUE, this setting enables the OS internal * consistency checks, this can trap several kind of errors in the user * code (or in the kernel itself). * - @p CH_DBG_ENABLE_STACK_CHECK=TRUE, this setting enables checks on * threads stack overflow. Note that this option is not available in * all ports, check your port documentation. If not supported then it * is silently ignored, see also the article @ref article_stacks. * - @p CH_DBG_FILL_THREADS=TRUE, this setting enables the threads workspace * filling, this can help examining the stack usage from your debugger. * . * Note that all the failed checks lock the kernel into the @p port_halt() * function. In order to assess what triggered the lock the global variable * @p panic_msg must be inspected using the debugger, the variable is a * pointer to an error message (a zero terminated string), the pointer may * contain @p NULL if the lock was triggered by a stack overflow. * *

Common errors and symptoms

* There are some common errors while using an RTOS, use the following * table as a check list, if your problem is not a generic programming error * then probably it is one of the following common RTOS/embedded related * mistakes: * - Insufficient stack allocated to one or more threads.
* Common symptoms: * - Target instability. * - Target locked into the @p port_halt() function. * - Target trapped into an exception handler (architecture dependent). * - Target apparent self reset (not real resets usually). * . * - Insufficient stack allocated to the IRQ stack (in those architectures * that have a separate IRQ stack, ARM as example).
* Common symptoms: * - Target instability. * - Target trapped into an exception handler (architecture dependent). * - Target apparent self reset (not real resets usually). * . * - Use of a non reentrant function from within an interrupt handler, as * example most C runtime functions.
* Common symptoms: * - Target instability. * - Unexpected application behavior. * . * - Missing use of a mutual exclusion mechanism to protect data * (or non reentrant code) shared among multiple threads and/or * threads and interrupt handlers, see also the article * @ref article_mutual_exclusion.
* Common symptoms: * - Target instability. * - Unexpected application behavior. * . * - Use of S-class or I-class APIs outside a proper lock state, see the * @ref concepts article, specifically the @ref api_suffixes and * @ref system_states sections.
* Common symptoms: * - Target instability. * - Target trapped into an exception handler (architecture dependent). * - Target apparent self reset (not real resets usually). * . * - Use of a non I-class API from an interrupt handler, see the * @ref concepts article, specifically the @ref api_suffixes and * @ref system_states sections.
* Common symptoms: * - Target instability. * - Target trapped into an exception handler (architecture dependent). * - Target apparent self reset (not real resets usually). * . * - Wrong threads priority assignment. One of the most critical things * to do when designing an RTOS based application is to assign correct * priorities to the threads in the system.
* Common symptoms: * - Excessive or unpredictable response times. * - Threads that appear to be never executed (CPU intensive threads at * higher priority). * . * . *

General suggestions

* For the less expert users, there are several things you may do in order * to minimize the need for debugging: * - Read carefully the documentation first. * - Try to find a code examples for things are you going to do, good sources * are: the documentation, the test code, under "./test" you will * find examples for almost any API in the ChibiOS/RT kernel and most * common RTOS related tasks, under "./testhal" there are examples * regarding the various device drivers, the various demos contain * good code samples too). * - Start your application from an existing demos, add things one piece at * time and test often, if you add too many things at once a small problem * can become a debugging nightmare. Follow the cycle: think, implement, * test, repeat. * - If you are stuck for too much time then consider asking for advice. * - Report bugs and problems, bugs can be fixed, problems can become new * articles in the documentation (this and other documentation articles * spawned from questions in the forum or in the tracker). * - Never give up :-) * . */