Thứ Hai, 16 tháng 4, 2018

[Embedded] sine and cosine function implementation in c using Taylor series

As we have known that, in embedded, math library is sometimes unavailable and unreasonable. Hence, the necessity of diagonal functions such as sine or cosine which are portable, fast and accurate is quite high.

So I refer from this to get the formula:
http://www.wolframalpha.com/widgets/view.jsp?id=f9476968629e1163bd4a3ba839d60925

In C, subsequently, I implemented these functions which may help you:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int compare_float(double f1, double f2)
{
 //double precision = 0.00001;
 double precision = 0.00000000000000000001;
 if ((f1 - precision) < f2)
  {
return -1;
  }
 else if ((f1 + precision) > f2)
 {
  return 1;
 }
 else
  {
return 0;
  }
}
double cos(double x){
if( x < 0.0f ) 
x = -x;

if (0 <= compare_float(x,M_PI_M_2)) 
{
do {
x -= M_PI_M_2;
}while(0 <= compare_float(x,M_PI_M_2));

}

if ((0 <= compare_float(x, M_PI)) && (-1 == compare_float(x, M_PI_M_2)))
{
x -= M_PI;
return ((-1)*(1.0f - (x*x/2.0f)*( 1.0f - (x*x/12.0f) * ( 1.0f - (x*x/30.0f) * (1.0f - (x*x/56.0f )*(1.0f - (x*x/90.0f)*(1.0f - (x*x/132.0f)*(1.0f - (x*x/182.0f)))))))));
return 1.0f - (x*x/2.0f)*( 1.0f - (x*x/12.0f) * ( 1.0f - (x*x/30.0f) * (1.0f - (x*x/56.0f )*(1.0f - (x*x/90.0f)*(1.0f - (x*x/132.0f)*(1.0f - (x*x/182.0f)))))));
}
double sin(double x){return cos(x-M_PI_2);}

[MCU AVR32] Floating point numbers - How can we deal with them?

Thứ Tư, 11 tháng 4, 2018

[MCU AVR32] How to print floating point numbers?

Method 1: https://startingelectronics.org/articles/atmel-AVR-8-bit/print-float-atmel-studio-7/
Method 2: 
If you can not do it by method 1, I have a tip for you.

Thứ Hai, 2 tháng 4, 2018

[Linker Script] Tổng quan về Linker Script language

Every link is controlled by a linker script. This script is written in the linker command language.

1. Linker Script là gì?
Thông thường khi chúng ta lập trình các ngôn ngữ (ví dụ là C hoặc C++), sau khi sử dụng gcc để biên dịch các file mã nguồn ra file object, chúng ta sẽ thường thấy có 1 lệnh theo sau đó bắt đầu bằng: ld trước khi ta có được một file có thể thực thi (executable file)

Ở đây, ld cũng giống như gcc, là một công cụ giúp chúng ta trong quá trình tạo ra file thực thi.
Như ta đã biết, khi sử dụng gcc, ta sẽ có các tham số đầu vào của gcc (inputs), ld cũng vậy, ngoài các options và các cờ, một inpput quan trọng nhất đó là 1 file script để chỉ cho ld biết nó sẽ phải thực hiện những gì.

Vậy ta có thể rút ra, linker script là một loại script language (giống như shell script hay python/matlab) và loại cript này được dùng riêng biệt cho ld.

           2. Kiến thức chung về linker script
Mục đích chính của linker script giúp cho ld viết cách để sắp xếp các vùng dữ liệu của một chương trình trong file thực thi. Như ta đã biết, một chương trình luôn có các vùng .data .text .heap (chưa kể các extension sections). 

Trong trường hợp nếu ta không sử dụng linker tự viết, một linker mặc định được tích hợp cùng với ld sẽ được dùng. Ngoài ra ta có thể sử dụng option --verbose khi gõ lệnh ld để hiển thị linker script mặc định.

Nếu ta muốn sử dụng scipt tự viết, ta cần thêm cờ -T khi sử dụng ld, khi đó ld sẽ thay thế script mặc định bằng script được input vào command.



Bài viết được dựa trên tài liệu: https://sourceware.org/binutils/docs/ld/Scripts.html#Scripts và các kiến thức thu thập được trong quá trình làm việc