인녕하세요
갑자기 생각이나서 질물 드립니다
Factor를 사용하면 정밀도는 낮아질 수 있지만 데이타 크기를 줄일 수 있다는 이유로 사용되는 것을 이해했습니다
Dbc 파일을 다운 받아서 보니까 offset 도 많이 쓰입니다
그냥 부호있는 정수를 쓰면 되는데 왜 오프셋을 써서 unsigned 타입으로 송출하는 신호가 많은지 잘 모르겠습니다 데이타 크기가 줄어드는 이유도 아니고 혹시 이유를 알려주시면 감사하겠습니다
인녕하세요
갑자기 생각이나서 질물 드립니다
Factor를 사용하면 정밀도는 낮아질 수 있지만 데이타 크기를 줄일 수 있다는 이유로 사용되는 것을 이해했습니다
Dbc 파일을 다운 받아서 보니까 offset 도 많이 쓰입니다
그냥 부호있는 정수를 쓰면 되는데 왜 오프셋을 써서 unsigned 타입으로 송출하는 신호가 많은지 잘 모르겠습니다 데이타 크기가 줄어드는 이유도 아니고 혹시 이유를 알려주시면 감사하겠습니다
안녕하세요~
이 부분은 저도 궁금한 부분인데 사실 정답은 모르겠습니다.
그래서 이유를 알려드린다기보다.. unsigned 에 offset을 쓰지않고 그냥 signed 데이터타입으로
했을 때의 단점을 한가지 말씀드려보겠습니다.
시그널의 사이즈를 bit 단위로 정의하는데
이게 8비트 16비트 32비트처럼 c언어에서 지원하는 데이터타입의 크기와 같다면
시그널의 데이터타입을 signed로 해서 사용해도
제어기 sw에서 음수 데이터를 처리하는데 크게 어려움이 없습니다.
can 메세지에서 받은 값을 signed type 변수에 담아주기만 하면 되니까요.
근데 그렇지 않은 경우에는 코딩할 때 한 가지 과정이 추가되야합니다.
signed 타입의 7비트 짜리 시그널을 정의하고 사용할 때, 음수를 어떻게 처리 할 건지 c언어로 구현해보시면.. 좀 더 귀찮겠구나 하는걸 알 수 있을겁니다.
예를 들어 -50이라는 값을 예시로 설명해보겠습니다.
-50을 8비트 기준 2진수로 표현하면 1100 1110 입니다.
signed char 데이터타입은 이 값을 -50이라 해석할 것이고
unsigned char 데이터 타입은 이 값을 206이라 해석할겁니다.
8비트 짜리 시그널을 signed로 셋팅하고
-50 이라는 값을 캐노로 찍어서 보냈을 때, 제어기 입장에서 이걸 -50이라고 해석하려면
signed char test_data;
test_data = (signed char)canrx_data[0];
요런식으로 하면 test_data 라는 데이터에 -50이라는 값이 들어가게 될겁니다.
근데 시그널이 c언어에서 지원하는 데이터타입이랑 크기가 맞지 않는 경우...
가령 예를 들어 7비트인 경우
이럴 경우에는 한가지 과정이 추가되야 합니다.
-50이라는 값을 7비트 기준 2진수로 표현하면 100 1110 가 됩니다.
unsigned char 데이터 타입은 이 값을 78로 인식할 것이고
signed char 데이터 타입은? 이 값을 -50으로 인식하는게 아니라 여전히 78로 인식합니다.
-50을 8비트 2진수로 표현한 값 = 1100 1110 이고
-50을 7비트 2진수로 표현한 값 = 100 1110 입니다.
7비트로 표현하게 되면.. 제일 앞에 자릿수가 1이 아니라 0이 되기 때문에
100 1110 = 0100 1110 이 됩니다.
그래서 이걸 signed char에 대입해도 제일 앞자리 비트가 1이 아니라 0이기 때문에..
-50이 아니라 78로 인식하게 됩니다.
그래서 이걸 해결하려면
signed int8 test_data;
test_data = ( 0x80 | (canrx_data[0] & 0x7F) );
이런식으로 하는게 제일 간단할 거 같네요.
암튼.. 한번 7비트 13비트.. 이런 비트 길이를 갖는 시그널을 signed 타입으로 만드신 다음에..
음수 어떻게 처리 할 건지 직접 코딩 해보시면 이해가 될 거 같습니다!
8,16,32 비트로 딱 떨어지지 않는 시그널의 경우 그것이 음수인지 양수인지 판단하기 위해 MSB 값을 확인해야하고..
그리고 확인이 아니라 우리가 송신할 때도 .. 음수로 바꿔서 넣는게 굉장히 귀찮습니다.
설명을 한다고 했는데 혹시 이해 안되시면 알려주세요! 감사합니다.
답글
yschoigreat
2022.11.18자세한 설명 감사합니다
무슨 말씀인지 이해했습니다
그런식으로 생각해보지 못했는데 도움이 되었습니다
yschoigreat
2022.11.18