옛날에 풋풋한(?) 여대생이 내 홈피에 질문을 올렸길래.
소상히 설명해줬던 자료 복구.
그리고 그녀는 우리네 아름이들이 다들 그렇듯.
고마웡~♥ 한 마디를 하는 둥 마는 둥 남기고 잘생긴 철수랑 동해바다로 놀러갔다. OK?
난 이해가 안 가는게 옆방에 여대가 MT오면 거기로 왜가냐.
공대생의 재빠른 리얼 초고속 연산이라면.
이것이 공대생임.
OK?
---- 2.
그림 12-13 을 봅시다.
나머지 연산을 사용한 경우 컴파일후 어셈블러에서 6명령어를 쓰고 있습니다.
C 레벨에서는 더 간단해 보이지만 어셈레벨로 보자면 IF 명령으로 때운 아래 케이스가 더욱 더 효율적입니다. 컴파일 후 명령어 개수가 4개로 줄었습니다.
더군다나 가장 최악의 명령인 bl 명령이 빠졌습니다.
점프문들은 ARM 내부에 파이프를 깨버리기 때문에 효율이 떨어집니다.
반복적으로 사용되면 낭비가 큽니다.
그리고 bl __rt_udiv 는 ADS 컴파일러에서 제공하는 내부 라이브러리를 호출한 것입니다.
사이즈도 커지고, __rt_udiv 안에서 뭔가 잔뜩 하고 오겠죠. 느리고, 큽니다.
펌웨어 레벨에서 늘 그렇듯이 printf 류의 코드를 자체 제공 라입을 붙이기 시작하면 느리고 커집니다.
위에서는 게다가 점프하기 위해서 복귀 주소를 저장하고 복귀하는 명령이 위 아래로 있네요.
사실 나머지 연산은 느리기 때문에 2의 승수인 경우 & 연산으로 바꿉니다. i % n 에서 n = 2의 m제곱이라면, i & (m - 1) 로 커버됩니다.
----3.
파이프라인이란?
3개에서 5개정도 명령어를 미리 해석해놓고 있다가 바로바로 펑펑 실행한다고 생각하면 됩니다.
마이크로프로세서 구조에서 배웠으리라 예상됩니다.
인스트럭션 패치 -> 인스트럭션 익스큐트 .. 등등 나오는 부분 보세요.
근데 이것이 B 계열 점프문을 쓰면 깨져버립니다.
새로 파이프에 채워넣어야 되요.
counter 1 의 경우 stmdb, add, mov, bl 4줄까지 파이프에 채워진 상태로 실행이 되지만,
bl 이후 어디로 점프할지 예측하기 어렵기 때문에 파이프는 깨지게 됩니다.
단, arm 11 의 경우 이러한 분기를 효과적으로 예측하는 구조가 포함되어 있긴 합니다.
----4.
sinh 의 문제입니다.
임베디드 프로세서에서는 효율의 문제가 큽니다. 보통 FPU 도 없죠.
이런 경우 sin 과 같은 계산은 굉장이 낭비를 유발하는 함수가 됩니다.
따라서 미리 계산된 값을 테이블에 넣어두고 유사값을 찾아내도록 만듭니다.
양 두 점의 평균값을 구하는 보간까지 적용하기도 합니다.
이 과정에서 당연히 정밀도는 떨어집니다.
또한 스위치 - 케이스문도 IF 문의 덩어리인데 이것도 테이블 룩업 방식으로 바꿀 수 있습니다.
속도는 메모리에서 찾는 그 속도로 끝납니다.
IF - ELSE 문이 주렁주렁 길어지는 경우 최악의 경우 N회의 비교를 해야 한다면,
테이블 룩업으로는 무조건 한 방에 끝나죠. 성능에도 도움되지만 전력도 덜 먹습니다.
따라서 MP3P 같은 경우 무자비한 테이블 룩업을 쓰기도 하고..
당연히 음질열화가 발생하기도 합니다.
----5.
그 밑에 func (void) 는 뭘하는 건지 모르겠지만. 그냥 메모리를 읽고 쓰는 함수네요.
포인터 공부좀 하시면 그냥 이해 됩니다.
0x30000100 위치에 0x12345678 을 쓰고
0x30000200 에 저장된 값을 읽어서 리턴합니다.
내부 레지스터 조작도 이런 방식으로 하고 별 건 아니에요.
---6.
inw 함수도 역시 메모리를 읽어내는 함수입니다.
여기서 volatile 의 용도를 보여주고 있습니다.
여기서는 굳이 안 써도 될 것 같습니다만.
volatile 이 선언되지 않으면 컴파일러 최적화 과정에서 예상치 못한 일들이 일어날 가능성이 있습니다.
이 키워드는 휘발성 범위를 설정합니다.
이건 네이버에서 찾으면 수두룩 나올 듯. 펌웨어 개발자들은 상습적으로 쓰죠.
---7.
그 밑에 func1 - func2 내용은 ARM 개발중 암썸 인터워킹 짬뽕 섞어쓰기를 다루고 있습니다.
ARM 명령어 보다 thumb 명령어가 코스트가 쌉니다.
thumb 명령어는 16비트 단위라서 메모리가 절약되고, 리얼뷰로 빌드한다면 성능까지도 개선됩니다.
이건 좀 복잡한 문제라서 스킵.
여튼 이걸 이렇게 섞어 쓸 수가 있는데 컴파일러가 코드를 어떻게 생성해주는지 보여준 내용이네요.
이상.