강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kwonjisu2159091
kwonjisu2159091

câu hỏi đã được viết

설계독학맛비's Thiết kế gia tốc HW thực tế bằng FPGA (từ điều khiển LED đến thiết kế gia tốc Fully Connected Layer)

[16장] PS에 올라가는 c 코드의 malloc 관련 질문입니다.

Đã giải quyết

Viết

·

570

1

- 강의 내용외의 개인 질문은 받지 않아요 (개별 과제, 고민 상담 등..)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요 맛비님, 강의 잘 보고 있습니다.
 
16장 Zynq PS C 코드에서 malloc 관련해서 질문이 있습니다.
 
main.c 코드의 40~41번 줄에서 write_buf 를 malloc하는데 실제 write_buf가 위치하는 물리적 메모리 주소를 알고싶어서 디버깅으로 값을 확인해봤습니다.
포인터 변수 write_buf는 0x120300 위치에 할당됩니다. 링커스크립트를 확인해보니 base 주소가 0x100000 부터 시작하는 DDR 영역이 맞습니다.
 
그런데 문제는 포인터 변수 write_buf가 가리키는 곳의 주소인데요,
write_buf[0], write_buf[1] 의 주소를 확인해보면 각각 0x0, 0x4 가 나옵니다. (printf -- %p , 디버거 변수로 같은 값인 것 확인)
 
Zynq 문서 UG585 113p 를 확인해보니 메모리 주소 0x0 부터 0x3FFFF 까지는 OCM (on chip memory) 으로 할당되었고,
UG585 732p 를 확인해보니 OCM은 256 KB의 RAM 을 포함한다고 되어있습니다.
 
 
0x0이라는 주소값을 감안하면 동적할당한 변수들은 RAM에 저장된 것 같습니다.
그런데 위와 같은 생각의 결과가 링커스크립트와 차이가 있어서 질문을 남기게 되었습니다.
 
링커스크립트(lscript.ld)에서 heap 영역에 대한 allocation을 확인해보면,
ps7_ddr_0 영역에 배치되어있습니다.
 
 
(서론이 길었습니다만 최종 질문...) write_buf 변수의 동적 할당된 주소 위치가 0x0으로 나오려면
heap 영역은 ps7_ram_0 영역에 allocation 되어야 하는 것 아닌가요??
 
 
아래 첨부한 사진은 컴파일 후 생성된 map파일에서 DDR 영역에 allocate되어 있는 heap 영역입니다.
 
 
 
임베디드fpga

Câu trả lời 2

1

coldugs님의 프로필 이미지
coldugs
Người đặt câu hỏi

먼저 빠른 답변 감사드립니다.

 

답변해주신 내용이 맞았네요.

링커스크립트에서 default로 할당한 heap 영역의 크기가 너무 작아서 DDR에 할당하지 못하고 RAM으로 밀려난 듯 합니다. (왜 되는지(?)에 대한 이유인것 같기도...)

해당 부분 수정해주니 정상적으로 heap 영역에 allocate되네요. 

(Verilog HDL 수강하지 않는데 링크는 들어가졌습니다.)

 

19장 강의에 잘 설명해주셨는데 괜한 질문을... 감사합니다 (_ _)

semisgdh님의 프로필 이미지
semisgdh
Người chia sẻ kiến thức

된다니 다행이네요. 

즐공하셔요 :)

0

semisgdh님의 프로필 이미지
semisgdh
Người chia sẻ kiến thức

안녕하세요 :)

해당 질문을 물어보실 수 있다니.... 실력자...?!

제가 제대로 이해했는지 모르겠는데요. 해당 이슈는 Mem alloc size 의 문제에서 발생하지 않았을까...? 하는 느낌이 듭니다. 

먼저 16장 영상에 mem alloc 의 버그가 있었습니다.

Verilog HDL 수강중이시면 해당 링크 보이실 수 있는데요.

https://inf.run/CRQT

위 링크 내용을 정리하면 16장 영상에서 vitis 의 default mem alloc size 를 사용중이고, 실제 SW 는 이보다 큰 영역을 사용중이었다. 결국 버그입니다.

19장에서 해당 내용을 다뤘고요. 

19장의 10:50 구간을 보신 이후에, 적용하셔서 다시 Test 부탁드려도 될까요?

HW 엔지니어라 이쪽 부분에는 조금? (많이) 약합니다.

즐공하세요 :)

 

 

Hình ảnh hồ sơ của kwonjisu2159091
kwonjisu2159091

câu hỏi đã được viết

Đặt câu hỏi