가장 간단한 프로그램을 해보려고 하는데
Exam1으로 프로젝트를 하나 만든다.
Nios II를 하나 만들고 c프로그램으로 선택하고 JTAG_UART를 선택한다.
C 언어의 경우 JTAG_UART가 모니터 프로그램에 나온다.
디버깅하기가 너무 편해졌다
컴파일러가 어셈블리어로 쫙 바꾼다.
printf를 했을 때 어떻게 되느냐
일일이 따라갈 필요는 없다.
결과값은 터미널 창에 나온다.
레지스터나 메모리 탭을 띄우지 않아도 된다
실험 6에서는 IO하는 부분을 다룰 것이다.
6장에서는 POLLED IO
7장에서는 INTERRUPT IO
푸쉬버튼 키가 4개 있는데
KEY0나 KEY2중에 하나를 누르면 출력이 되고
KEY3나 KEY1을 눌렀을 때 출력이되는데
몇개가 눌렸는지를 출력하는 형태를 돌려보려 한다.
우측에 있는 예제를 돌릴것인데
터미널 DEVICE를 사용하지 않는다.
인티저의 포인터 변수를 선언하고
무엇을 가리키느냐? int형의 자료를 가리키는 포인터를 선언하고
LEDR BASE를 가리킨다. (타입 캐스팅을 한것이다. )
타입 미스매치 같은것들이 있을 때 워닝을 무시하고 넘어가면 안된다.
타입 캐스팅을 명시적으로 해서 컴파일러에게 의도적으로 했다는것을 알려주는것이 좋다.
그래야 컴파일러가 효율적으로 작동한다.
static volatile
스태틱은 정적변수인데 변수의 값이 사라지지 않고 계속 업데이트 되는값
main함수가 있고
display_led
함수의 인풋으로 넘버를 받는다.
베이스 레지스터에 원하는 값을 써주면 된다.
LEDR_ptr에 넘버를 넣어라
키포인터가 가리키고 있는 값의 벨류를 뱉어내라
비트 와이스해서 0번이랑 1번만 남는데 그것이 val1
키 두개를 두개만큼 쉬프트
마지막에 더해서
디스플레이
volatile:휘발성
non-volatile 메모리
NVM
전원을 꺼도 데이터가 사라지지 않는다.
NVM이 플레쉬 메모리
Dram은 휘발성이지만 엄청 빠릅니다.
DRAM은 계속 refresh해줘야 되서 쓸 때 없이 전력을 공급해줘야 한다.
NAND FLASH는 전력소모가 훨씬 작고 가격도 훨씬 싸다.
차세대 NVM을 계획을 하고 있다.
valotile은 손상되기 쉬운 형태라고 보면 된다.
쉽게 데이터가 변경이 될 수 있다
foo라는 변수가 있고 void bar(void)
foo가 0이었는데 foo가 255가 아니면 계속 루프를 돈다.
여러분이 코드를 왼쪽 처럼 짜도 컴파일러는 우측처럼 괜찮게 뽑아줍니다
여러분 컴파일러 얕보면 안돼요~
포인터변수가 메모리에 있는 변수이기도 하지만 IO와 연결이 되어있다.
키포인터 같은 경우 상수값이 아니잖아요
외부에서 눌리는 상황에 따라서 언제 눌렸는지에 따라서 그 값이 변화무쌍하다.
volatile 이라는 키워드가 붙여지면
이변수는 휘발성인가
네가 이 코드상에서 안변한다고 생각해도 외부의 입력 때문에 변할수도 있는거야'
라고 컴파일러에게 말해주는것이다.
컴파일러가 고치려고 할 때 volatile이라면 컴파일러가 이 코드를 고치지 않는다.
while문을 돌 때 마다 계속 체크를 해야하니 컴파일러가 코드를 optizmization을 일으키지 않아요.
그래서 계속 체크해줘야 하는 값을을 volatile을 해줘야 한다.
static volatile int *LEDR_ptr = (int*) LEDR_BASE;
가리키는 대상이 static이고 valotile이다.
c프로그램으로 작성하는데
TEST_NUM이 주어져 있으면
가장 긴 1의 비트가 쭉 연속적으로 나오는 애를 찾으라~
마찬가지로 0이 쭉 나올텐데 그것의 값을 찾아서 HEX1-0에 출력하고
~~
인터럽트는 안쓰고 타이머를 사용해도된다
partI
#include <stdio.h>
int main()
{
int big=0;
int n=0;
int LIST[9] = {7, 4, 5, 3, 6, 1, 8, 2, 9};
big=LIST[0];
for(n=1;n<=8;++n)
{
//printf("n is %d\n",n);
if(big<=LIST[n])
{
big=LIST[n];
}
}
printf("best number is %d \n",big);
return 0;
}