본문 바로가기

전체 글

[Rust] 벡터 (Vector) Vector Vector는 컬렉션 타입이며 메모리에서 모든 값을 근처에 있는 단일 데이터 구조에 둘 이상의 값을 저장할 수 있습니다. 또, 벡터는 같은 유형의 값만 저장할 수 있습니다. 벡터는 컴파일 타임에 사이즈를 정할 필요는 없고, 동작중에 늘어나거나 줄어들 수 있습니다. 벡터는 scope밖으로 벗어날 경우 해제 됩니다 벡터 생성 벡터를 생성하려면 Vec::new() 함수 또는 vec! 매크로로 생성을 합니다. 초기 값으로 벡터를 생성하면 Rust는 값의 타입을 유추합니다. let v: Vec = Vec::new(); let v = vec![1, 2, 3]; Element 추가 push() 메소드를 사용하면 벡터에 element를 넣을 수 있습니다. let mut v = Vec::new(); v.pu.. 더보기
LLVM Hello world IR생성 LLVM Hello world입니다. clang으로 IR생성하는법을 적어봅니다. 먼저 add.c 파일을 아래와 같이 생성합니다 int globvar = 12; int add(int a) { return globvar + a; } 아래 명령어를 수행하면, (clang install해야합니다) clang -emit-llvm -c -S add.c 아래와 같이 add.ll 파일이 생성됩니다. ; ModuleID = 'add.c' source_filename = "add.c" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @gl.. 더보기
[Rust] 타입 추론 (Type Inference) 러스트에서 변수의 타입은 타입에서 추론하거나 일반적으로 유추할 수 있습니다. 이러한 변수를 초기화하는 데 사용되는 표현식입니다. 다음과 같이 선언만 문장이 있습니다.: let number; 위와 같이하고 컴파일하면 에러가 발생합니다. 컴파일러는 그러한 변수에 데이터 유형을 할당할 수 없기 때문에 오류가 에러가 발생합니다. . 메시지는 다음과 같습니다. error[E0282]: type annotations needed 이 에러는 해당 변수의 타입이 지정되어야 함을 의미합니다. 아래와 같이 선언후에 어떤 타입인지를 명기해 주어야 합니다. let number:u32; 컴파일러가 어떤 유형의 변수인지 이해하면 해당 변수에 대한 모든 할당은 해당 타입의 표현식을 사용해야 합니다. 그렇지만, 타입을 추측할 수 있.. 더보기
[RISCV] Toolchain Install RISC-V의 툴체인은 GCC를 비롯한 일련의 S/W 를 말한다. RISC-V 를 사용하기 위해서는 이 툴체인이 설치되어야 하며, 아래가 공식 툴체인이다. https://github.com/riscv/riscv-gnu-toolchain 그리고 물론 LLVM도 최신 버젼에서 riscv를 지원하때문에 , gcc대신에 LLVM으로 사용도 가능하다. 하지만, 현재 인터넷에 널려있는 자료들이 대부분 gnu gcc기준으로 작성되어 있기떄문에, gnu gcc로 어느정도 툴을 익히고 llvm등을 사용하는게 좋을듯 하다. gcc 전체를 만드는 것은 컴파일 하는데 꽤 시간이 오래 걸리기때문에, OS별로 pre-compile 해놓은 버젼도 있다. 잘 안되면 이 버젼을 그냥 가져다 쓰는 것도 나쁘지 않다. 그리고 gcc도 m.. 더보기
[RISCV] Tang nano로 Hello RISC-V 메뉴얼에 있는대로 pico soc를 합성하고 올려보았다. 아래는 스크린샷. Project picotiny를 읽어서 합성하면 되는데 , 안되는 경우 Project-> configuration에서 , 아래 MSPI를 체크하고 합성을 진행한다. 정상 구동되는것 확인한다. tangnano는 이 자체로 uart동작하는 칩도 같이 붙어 있으므로 별도 작업없이 터미널 테스트가 가능하다. Windows에서 power shell을 열어서, 아래와 같은 명령어로 uart가 되는지 확인, 아래 getportname으로 포트번호를 확인한다음에 , putty와 같은 프로그램으로 COM[포트번호] 로 연결 해서 잘 동작하는지 확인한다. [System.IO.Ports.SerialPort]::getportnames() $port= .. 더보기
[RISCV] Chisel chisel은 한글로 하면 끌이라는 도구로 나무나 돌 얼음등을 긁는 도구이다. RISC-V에서의 chisel은 scala 기반의 RTL Generator를 이야기하는 것이고 버클리에서 처음 만든 RISC-V가 이 chisel을 기반으로 생성되었다. 여기에 rocket chip generator라고, 단순히 하나의 model을 만드는것이 아니라 좀더 scalable하게 만들수 있는 구조이다. 이 기반이 되는 scala라는 language인데, 이게 저변은 그렇게 넓지는 않지만, 함수형언어로 완성도 측면에서는 완결성을 가지는 구조이기때문에, 결과물도 formal하게 나오는 것으로 보인다. 그래서 RISC-V에서 여러버젼이 있지만 이 rocket chip을 이용하려면 이 scala를 약간은 핸들링할수 있어야한.. 더보기
[RISCV] Tang nano 9K 알리에서 우연찮게 찾은 키트다. FPGA, 사실 이전에는 들어 보지도 못한 Gowin이라는 대륙 벤더에서 나온 FPGA를 사용한 제품인데, 기본적으로 가성비가 좋음. 이 글쓰면서 알아보니, 래티스반도체 에서 나온분이 2014년에 만든 FPGA벤더이고, 출하량도 생각보다 굉장히 많음. FPGA업계 점유율 1위는 자일링스이고, 2위가 알테라(인텔) ,, 그리고 래티스 , ICE라고 외국애들 보면 취미로 하는 얘들이 래티스의 ICE를 많이 사용하고,, 고윈은 순위권밖이긴하지만, 10위안에 드는 회사로 인듯, 이 고윈 반도체 칩을 사용해서 SiPEED라는 회사가 만들었음, 이 당나노는 업체에서 만든것 외에는 거의 자료가 없음. 그리고 검색하다보니, 이 tang nano의 당은 당나라의 당을 따서 만든듯 하다.... 더보기
Rust, If 문 및 loop문, control flow (제어문) if statement 제어문, if-else 류는 문들은 보통 모든 언어들에 있는 구문이고, 여기서는 rust가 다른 언어들과 조금 다른 점들만 기술한다. if [conditions] ... condition은 boolean식만 들어갈 수 있다. "? : " 와 같은 삼항 연산자 역시 제대로 동작한다, 특이한 점은 condition에 괄호() 가 필요 없다는점. if condition { ... } else { ... } Conditional loop(while) while같은 conditional loop도 동일하다, 조건이 만족하면 loop가 실행되고, 아니면 빠져나가는것, let mut i = 1; while i while true 로 치환된다 일종의 syntax sugar fn main() { .. 더보기