embedded
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| embedded [2020/04/05 18:03] – jrseti | embedded [2020/04/05 18:57] (current) – [Tips] jrseti | ||
|---|---|---|---|
| Line 9: | Line 9: | ||
| - Power | - Power | ||
| - Processing power | - Processing power | ||
| + | |||
| + | =====Tips===== | ||
| + | |||
| + | On ARM Processors: | ||
| + | |||
| + | * Unordered List ItemGenerally local variables are allocated in registers. However if we take the address of a local variable, compiler will not allocate the variable to register. | ||
| + | * The compiler will never put the global variable into register. | ||
| + | * Try to ensure that small functions take four or fewer arguments. These will not use the stack for argument passing. It will copied into registers. | ||
| + | * If a function needs more than four arguments, try to ensure that it does a significant amount of work, so that the cost of passing the stacked arguments is outweighed. | ||
| + | * Pass pointers to structures instead of passing the structure itself. | ||
| + | * Put related arguments in a structure, and pass a pointer to the structure to functions. This will reduce the number of parameters and increase readability. | ||
| + | * Minimize the number of long long parameters, as these take two argument words. This also applies to doubles if software floating-point is enabled. | ||
| + | * Avoid functions with a parameter that is passed partially in a register and partially on the stack (split-argument). This is not handled efficiently by the current compilers: all register arguments are pushed on the stack. | ||
| + | * Avoid functions with a variable number of parameters. Varargs functions | ||
| + | |||
| + | On Arm there is the " | ||
| + | |||
| + | Example: | ||
| + | < | ||
| + | __pure int square(int x) | ||
| + | { return x * x; | ||
| + | } | ||
| + | </ | ||
| =====Integral Types====== | =====Integral Types====== | ||
| Line 92: | Line 115: | ||
| * Limitations: | * Limitations: | ||
| - | ====Lacro Functions==== | + | ====Macro Functions==== |
| #define square_macro(x) x*x | #define square_macro(x) x*x | ||
| Line 104: | Line 127: | ||
| ====Inline Functions==== | ====Inline Functions==== | ||
| - | Almost identical to regular functions | + | * Almost identical to regular functions |
| - | Add the " | + | |
| - | The compiler may decide not to inline | + | |
| - | You can force the compiler to always inline | + | |
| + | |||
| + | To force inlining: | ||
| + | < | ||
| + | Int square_AI(unsigned char x)__attribute__((always_inline)); | ||
| + | Int square_AI(unsigned char x) { | ||
| + | Return x*x; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | To suggest inlining: | ||
| + | < | ||
| + | Int inline square_SI(unsigned char x){ | ||
| + | Return x*x; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Inline advantages over macros: | ||
| + | |||
| + | * Compiler checks parameter types | ||
| + | * Debugging is easier | ||
| + | |||
| + | =====Floating Point Alternatives===== | ||
| + | |||
| + | * Note that for a float 100, | ||
| + | * Use fixed point when you can anticipate the range | ||
| + | * Fixed point can be faster than float on processors without an FPU | ||
| + | |||
| + | =====System Design = Elevator===== | ||
| + | |||
| + | Design an elevator. Think about it, there are some user controls and indicators that need to be implements, some sensors and auto controls, some for safety. | ||
| + | |||
| + | Process car calls | ||
| + | Process hall calls | ||
| + | Indicate direction | ||
| + | indicate current floor | ||
| + | |||
| + | Move and stop the car | ||
| + | Emergency brake | ||
| + | Open/close the door | ||
embedded.1586109788.txt.gz · Last modified: 2020/04/05 18:03 by jrseti