Sunday, November 30, 2014

Array initialization

Basic initialization
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
other syntax 
int myArray[10] = { [4] = 5, [2] = 5 }; 
is equivalent to
int myArray[6] = { 0, 0, 5, 0, 5, 0 };
initialize a range of elements to the same value
int myArray[10] = {[0 ... 9] = 5};
 
Elements with missing values will be initialized to 0:
int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

So this will initialize all elements to 0:
int myArray[10] = { 0 }; // all elements 0(only for Zero initial)

Remember that objects with static storage duration will initialize to 0 if no initializer is specified:
static int myArray[10]; // all elements 0

In C++, an empty initialization list will also initialize every element to 0. This is not allowed with C:
int myArray[10] = {}; // all elements 0 in C++


And that "0" doesn't necessarily mean "all-bits-zero", so using the above is better and more portable than memset(). (Floating point values will be initialized to +0, pointers to null value, etc.)
Reference
[1] http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c
[2] https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
[3] http://www.lemoda.net/c/array-initialization/ (experiment)






Sunday, November 16, 2014

Inline Functions versus Macros

add my commend into the content

  1. Inline functions follow all the protocols of type safety enforced on normal functions.
    • more safe then the macro, especially, for the type defination.
    • for the type check, macro is checked by prepocessor, and inline functions is checked by compilar.
  2. Inline functions are specified using the same syntax as any other function except that they include the inline keyword in the function declaration.
    • only difference is keyword “inline”
  3. Expressions passed as arguments to inline functions are evaluated once. In some cases, expressions passed as arguments to macros can be evaluated more than once.
    • more variable for arguments
  4. There is no risk if called multiple times. But there is risk in macros which can be dangerous when the argument is an expression.
  5. functions can include multiple lines of code without trailing backlashes.
  6. functions have thier own scope for variables and they can return a value.
  7. debuging

Reference

[1] http://msdn.microsoft.com/en-us/library/bf6bf4cf.aspx

[2] http://www.thegeekstuff.com/2013/04/c-macros-inline-functions/

Friday, November 14, 2014

function and function-like macro

if we use the same name for those things. avoid the prepocessor will expand the function first, we usaully add parenthese to prevent.

simple example

#include <stdio.h>
#define test(x) __test(x)
#define __test(x) printf("\n%d\n", x + 1);

int test(int x);
#undef test

int main()
{
    test(1);
}
int (test)(int x)
{
    printf("\n%d\n", x);
}

Referemce

http://stackoverflow.com/questions/13600790/what-do-the-parentheses-around-a-function-name-mean

Friday, November 7, 2014

Thursday, November 6, 2014

CRP

CRP(Code read protection) is a way to avoid someone to get code from flash.

CRP

In C, Keyword “static”

 
#include <stdio.h>

int global_var; //statically allocated as a global variable
static int static_var; //statically allocated but only accessible within file

void my_function(void){
static int my_static = 0; //statically allocated, accessible within my_function
int my_stack = 0; //allocated on the stack

printf("my_static:%d, my_stack:%d\n", my_static, my_stack);
my_stack++;
my_static++;
}
Answer: 

my_static:0, my_stack:0
my_static:1, my_stack:0
my_static:2, my_stack:0
my_static:3, my_stack:0
my_static:4, my_stack:0
Reference
[1] http://coactionos.com/embedded%20design%20tips/2013/10/18/Tips-RAM-Flash-Usage-in-Embedded-C-Programs/

RAM/Flash Usage in Embedded C Programs

 

Read-only memory(Flash)

Data Section

int data_variable = 500;

Read-only date



constant

const int read_only_variable = 2000;

Text(code)



“literal pool” may in the function.


void my_function(void){
int x;
x = 200;
printf("X is %d\n", x);
}

Read-Write Data(RAM)


Data section


int data_var = 500; //require flash memory to stored.

BSS section


int bss_var0;
int bss_var1 = 0;
//doesn’t need require flash memory to stored.

Heap section


static int static_var;
buffer = malloc(512);

Stack section


int my_function(int a, int b, int c, int d)

Reference


[1] http://coactionos.com/embedded%20design%20tips/2013/10/18/Tips-RAM-Flash-Usage-in-Embedded-C-Programs/

Monday, November 3, 2014

Assembly command note

 

The syntax of MOV can also be more complex as the following examples show.[7]

MOV EAX, [EBX]	  ; Move the 4 bytes in memory at the address contained in EBX into EAX
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX

 


Reference


[1] http://en.wikipedia.org/wiki/Assembly_language

Time Stamp

for keil compilar environment, they had a defination for time stamp, therefore we could use that to be a release note for product purpose.

how to use?

printf("%s %s",__DATE__,__TIME__);

or you could assign memory for them.

U8 KC_DATA Datestring[sizeof(__DATE__)];
U8 KC_DATA Timestring[sizeof(__TIME__)];


memcpy(Datestring, &__DATE__, sizeof(__DATE__));
memcpy(Timestring, &__TIME__, sizeof(__TIME__));

 

Reference

[1] http://www.keil.com/forum/2789/display-time-and-date/

compilar a specific memory address for variable and function

Compiler-specific Features [4]

function attributs

assign a section for place function code [1,2]

Variable attributs

locating a variable at absolute memory address [3]

Reference

[1] http://www.keil.com/support/man/docs/armccref/armccref_Cacbgief.htm

[2] http://www.keil.com/forum/13875/-at-for-function-address/

[3] http://www.keil.com/support/docs/2829.htm

[4] http://www.keil.com/support/man/docs/armccref/armccref_chdfijae.htm

Register Transfer Level Design with Verilog (1) [ebook]

設計程式之所以有趣不外乎是它的千變萬化,同樣的結果卻有不同的寫法。 但這些不同寫法當中也並沒有分誰對誰錯,也沒有制定標準來規範何事該用何解。 這也就是我們設計者的珍貴!! [1] Primitive Instantiations 在Verilog中最基本的邏輯...