2021년 8월 14일 토요일

1.4 기본 스타일 시트 사용자 정의

이전 레시피(1.3 Qt Designer에서 스타일시트 사용하기)에서 Qt Designer를 사용하여 위젯에 스타일 시트를 적용하는 방법을 배웠습니다. 몇 가지 다른 유형의 위젯을 만들고 학습을 위해 위젯의 스타일 속성을 변경하여 작업을 더 진행해 보겠습니다.

그러나 이번에는 위젯에 하나씩 스타일을 적용하지 않고 main window에 스타일 시트를 적용하고 다른 모든 위젯에 계층 구조를 상속하도록 하는 것이 스타일 시트를 장기적으로 유지 관리에 용이 합니다.

다음 예제에서는 캔버스에서 다양한 유형의 위젯 형식을 지정하고 스타일 시트에 일부 코드를 추가하여 모양을 변경합니다.

  1. 이전 레시피(1.3 Qt Designer에서 스타일시트 사용하기)에서 Push Button에 적용한 스타일 시트를 제거합니다. Push Button의 스타일 시트를 선택하고 styleSheet 속성 옆에 있는 작은 화살표 버튼을 클릭하여 스타일 시트를 제거합니다. 이 버튼은 속성을 기본값으로 되돌립니다.
  2. 위젯 상자에서 Form편집기로 line edit, combo box, horizontal slider, radio button, check box 위젯들을 하나씩 드래그하여 UI에 추가합니다.

  3. 간단하게 하기 위해 Object Inspector에서 menuBar, statusBar를 UI 삭제합니다. menuBar 및 statusBar를 선택하고 마우스 오른쪽 버튼을 클릭한 다음 제거를 선택합니다. 이제 UI가 다음과 유사해야 합니다.

  4. Form 편집기나 Object Inspector에서 MainWindow을 선택한 다음 마우스 오른쪽 버튼을 클릭하고 Change styleSheet를 선택하여 Edit Style Sheet 창을 엽니다. 스타일 시트에 다음을 삽입하십시오.

    << code >>

    border: 2px solid gray;

    border-radius: 10px;

    padding: 0 8px;

    background: yellow;


  5. 두꺼운 테두리와 함께 모든 것이 노란색으로 덮여 있는 UI를 볼 수 있습니다. 이는 앞의 스타일 시트에 선택기가 없기 때문입니다. 즉, 스타일이 계층 구조 아래까지 기본 창의 자식 위젯에 적용됩니다. 이를 변경하려면 다른 방법을 시도해 보겠습니다.

  6. 이번에는 PushButton만 앞의 코드에서 설명한 스타일을 가져오고 다른 모든 위젯은 기본 스타일로 되돌리겠습니다. UI에 푸시 버튼을 몇 개 더 추가하면 모두 동일하게 보일 것입니다.

    << code >>

    QPushButton {

    border: 2px solid gray;

    border-radius: 10px;

    padding: 0 8px;

    background: yellow;

    }


  7. 이것은 QPushButton 클래스를 사용하여 모든 위젯에 스타일을 적용하도록 선택기에 구체적으로 지시하기 때문에 발생합니다. 다음 코드와 같이 스타일 시트에서 이름을 언급하여 푸시 버튼 중 하나에만 스타일을 적용할 수도 있습니다.

    << code >>

    QPushButton#pushButton_3 {

    border: 2px solid gray;

    border-radius: 10px;

    padding: 0 8px;

    background: yellow;

    }



  8. 이 방법을 이해하면 스타일 시트에 다음 코드를 추가할 수 있습니다.

    << cdoe >>

    QPushButton {

    color: red;

    border: 0px;

    padding: 0 8px;

    background: white;

    }


    QPushButton#pushButton_2 {

    border: 1px solid red;

    border-radius: 10px;

    }


  9. 이 코드는 기본적으로 모든 푸시 버튼의 스타일과 pushButton_2 버튼의 일부 속성을 변경합니다. pushButton_3의 스타일 시트를 그대로 유지합니다. 이제 버튼은 다음과 같이 보일 것입니다.

    << code >>

    QPushButton {

    color: red;

    border: 0px;

    padding: 0 8px;

    background: white;

    }


    QPushButton#pushButton_2 {

    border: 1px solid red;

    border-radius: 10px;

    }


    QPushButton#pushButton_3 {

    border: 2px solid gray;

    border-radius: 10px;

    padding: 0 8px;

    background: yellow;

    }


  10. 첫 번째 스타일 시트 세트는 QPushButton 유형의 모든 위젯을 테두리와 빨간색 텍스트가 없는 흰색 직사각형 버튼으로 변경합니다. 두 번째 스타일 시트 세트는 pushButton_2라는 특정 QPushButton 위젯의 테두리만 변경합니다. pushButton_2의 배경색과 텍스트 색상은 각각 흰색과 빨간색으로 유지됩니다. 두 번째 스타일 시트 세트에서 재정의하지 않았기 때문에 적용할 수 있으므로 첫 번째 스타일 시트 세트에 설명된 스타일로 돌아갑니다. 모든 QPushButton 위젯에. 세 번째 스타일 시트 세트에서 Color 속성을 설정하지 않았기 때문에 세 번째 버튼의 텍스트도 빨간색으로 변경되었습니다.
  11. 다음 코드를 사용하여 범용 선택기를 사용하는 다른 스타일 시트 세트를 만듭니다.

    << code >>

    *{

    background: qradialgradient(cx: 0.3, cy: -0.4, fx: 0.3, fy: -0.4, radius: 1.35, stop: 0 #fff, stop: 1 #888);

    color: rgb(255, 255, 255);

    border: 1px solid #ffffff;

    }


    QPushButton {

    color: red;

    border: 0px;

    padding: 0 8px;

    background: white;

    }


    QPushButton#pushButton_2 {

    border: 1px solid red;

    border-radius: 10px;

    }


    QPushButton#pushButton_3 {

    border: 2px solid gray;

    border-radius: 10px;

    padding: 0 8px;

    background: yellow;

    }


  12. 범용 선택기는 유형에 관계없이 모든 위젯에 영향을 미칩니다. 따라서 앞의 스타일 시트는 모든 위젯의 배경에 그라디언트 색상을 적용하고 해당 텍스트를 흰색인 1픽셀 실선 윤곽선으로 흰색으로 설정합니다. 색상 이름을 쓰는 대신 rgb 함수(rgb(255, 255, 255)) 또는 16진수 코드(#ffffff)를 사용하여 색상 값을 지정할 수 있습니다.
  13. 이전과 마찬가지로 앞의 스타일 시트는 푸시 버튼에 영향을 주지 않습니다. 왜냐하면 우리는 이미 고유한 스타일을 부여했으며, 이는 범용 선택기에 설명된 일반 스타일을 재정의할 것입니다. Qt에서는 위젯에 영향을 미치는 하나 이상의 스타일이 있을 때 더 구체적인 스타일이 궁극적으로 사용됩니다.  이제 UI가 다음과 같이 표시됩니다.


1.3 Qt Designer에서 스타일시트 사용하기

 이 예에서는 스타일 시트와 리소스를 사용하여 프로그램의 모양과 느낌을 변경하고 보다 전문적으로 보이게 하는 방법을 배웁니다. Qt를 사용하면 웹 디자이너가 웹사이트를 장식하는 데 사용하는 CSS(Cascading Style Sheets)와 매우 유사한 Qt 스타일 시트라는 스타일 시트 언어를 사용하여 그래픽 사용자 인터페이스(GUI)를 장식할 수 있습니다.


  1. Qt Creator를 열고 새 프로젝트를 만듭니다. Qt Creator를 처음 사용하는 경우 New Project라는 버튼을 클릭하거나  File | New File or Project 클릭 합니다.
  2. Projects 창에서 Application을 선택하고 Qt Widgets Application을 선택합니다.

  3. 프로젝트 이름과 위치를 입력하라는 창이 나타납니다. 

  4. 프로젝트 이름과 위치를 지정하고Next을 여러 번 클릭하고 마침 버튼을 클릭하여 프로젝트를 생성합니다. 지금은 기본 설정을 그대로 사용하겠습니다. 프로젝트가 생성되면 가장 먼저 표시되는 것은 모드 선택기 패널이라고 하는 창 왼쪽에 여러개의 아이콘이 있는 패널 입니다. 

  5. 모드 선택기 패널 옆에 있는 사이드바 패널에서 나열된 모든 소스 파일을 볼 수 있습니다. 여기에서 편집할 파일을 선택할 수 있습니다. 이 경우 프로그램의 UI 디자인을 시작하려고 하기 때문에 Forms/mainwindow.ui을 클릭합니다.
  6. mainwindow.ui 파일을 두 번 클릭하면 다른 인터페이스가 갑자기 나타나는 것을 볼 수 있습니다. Qt Creator는 실제로 열려고 하는 파일에서 .ui 확장자를 감지했기 때문에 스크립트 편집기에서 UI 편집기(Qt Designer)로 전환합니다.  모드 선택기 패널에서 강조 표시된 버튼이 편집 버튼에서 디자인 버튼으로 변경되었음을 알 수 있습니다. 모드 선택기 패널의 상단에 있는 버튼 중 하나를 클릭하여 스크립트 편집기로 다시 전환하거나 다른 도구로 변경할 수 있습니다.

  7. 위젯 상자(Buttons 범주 아래)에서 Push Button을 Form편집기의 main window으로 끌어서 UI에 푸시 버튼을 추가해 보겠습니다. 푸시 버튼을 선택된 상태로 유지하면 창 오른쪽의 속성 편집기에서 이 버튼의 모든 속성을 볼 수 있습니다. 스크롤하여 styleSheet라는 속성을 찾습니다. 여기에서 위젯에 스타일을 적용할 수 있습니다. 위젯은 스타일 시트를 설정하는 방법에 따라 자식이나 손자에게 재귀적으로 상속되거나 상속되지 않을 수 있습니다. 또는 양식 편집기에서 UI의 위젯을 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 스타일시트 변경...을 선택할 수 있습니다.

  8. styleSheet 속성의 입력 필드를 클릭하여 스타일 시트 코드를 직접 작성하거나 입력 필드 옆에 있는 … 버튼을 클릭하여 스타일 시트에 대한 코드를 작성할 수 있는 Edit Style Sheet 창을 열 수 있습니다. 창 상단에는 속성 이름이 기억나지 않는 경우 코딩을 시작하는 데 도움이 되는 Add Resource, Add Gradient, Add Color및 Add Font와 같은 여러 버튼이 있습니다. 스타일 시트 편집 창을 사용하여 간단한 스타일링을 시도해 보겠습니다.

  9. Add Color의 아래 화살표를 클릭하여 color를 선택하고 원하는 색상을 선택합니다.
  10. 스타일 시트 편집 창의 텍스트 필드에 코드 줄이 추가되었습니다. 제 경우에는 다음과 같습니다.

  11. OK 버튼을 클릭하면 Push Button의 텍스트가 빨간색으로 변경되어야 합니다.

이전 섹션에서 우리는 C++ 코딩을 통해 Qt 위젯에 스타일 시트를 적용하는 방법에 대해 논의했습니다. 대부분의 경우 프로그램의 UI 디자인을 담당하는 사람은 프로그래머가 아니라 사용자 친화적인 UI 디자인을 전문으로 하는 UI 디자이너입니다. 이 경우 UI 디자이너가 코드를 어지럽히지 않고 다른 도구로 프로그램의 레이아웃과 스타일 시트를 디자인하도록 하는 것이 좋습니다. Qt는 Qt Creator라는 올인원 편집기를 제공합니다.

Qt Creator는 스크립트 편집기, 컴파일러, 디버거, 프로파일러 및 UI 편집기와 같은 여러 도구로 구성됩니다. Qt Designer라고도 하는 UI 편집기는 디자이너가 코드를 작성하지 않고도 프로그램의 UI를 디자인할 수 있는 완벽한 도구입니다.



2021년 1월 18일 월요일

이클립스 설치 및 한글 패치

운영체제 정보 : Ubuntu 18.04.2

이클립스 설치 버전 : 2019-03

이클립스 2019-03 다운로드




 sudo apt-get install openjdk-8-jdk




운영체제 정보 : Ubuntu 16.04.1

이클립스 설치 버전 : 2019-12(4.14.0)

우분투 소프트웨어 설치 매니져에서 eclipse














한글 패치
https://godh.tistory.com/6 참고



Petalinux NTP 추가(Zturn)

1. 기본적으로 petalinux에서 제공해주고있다. 

$ vi /project-spec/meta-user/recipes-core/images/petalinux-image-full.bbappend

IMAGE_INSTALL_append = " ntp"

추가한다.

2. rootfs 설정

$ petalinux-config -c rootfs 

user packages --> [*] ntp

설정 후 빠져나간다.

3. rootfs 빌드

$ petalinux-build -c rootfs && petalinux-build



========================================================

1. 없을 경우 직접 설치함으로서 가능하지만 의존성의 문제를 잘 해결해야한다. 

2. petalinux에서 사용하는 Yocto 버전 확인

petalinux 설치 디렉토리로 이동하여 아래 명령을 이용하여 버전을 확인한다.

$find . -name poky.conf -print0 | xargs --null grep -HEi 'DISTRO_CODENAME =|DISTRO_VERSION ='


3. https://layers.openembedded.org/layerindex/branch/rocko/layer/meta-networking/ 사이트에 이동하여 NTP를 찾아 Yocto버전에 맞는 NTP의 ntp_%.bbappend 파일과 recipes-support/ntp/ntp_4.2.8p10.bb 파일을 

4. 


2021년 1월 13일 수요일

Ubuntu 20.04 에 Vivado 2018.04 (petalinux 2018.03)설치시 문제점 해결

방금 Ubuntu 20.04에 vivado를 설치했습니다.

웹 설치 프로그램 Java GUI 문제를 해결하려면 1 단계 Ubuntu 버전 이름을 20.04에서 18.04로 일시적으로 변경합니다.


sudo vi / etc / os-release>


NAME = "Ubuntu"
# VERSION = "20.04.1 LTS (Focal Fossa)"
VERSION = "18.04.4 LTS (Bionic Beaver)"


2 단계, libtinfo.so.5 오류 수정 :-


"응용 프로그램 별 초기화 실패 :"librdi_commontasks.so "파일을로드 할 수 없음 : libtinfo.so.5 : 공유
개체 파일을 열 수 없음 : 해당 파일 또는 디렉터리가 없습니다."

sudo apt 업데이트
sudo apt install libtinfo-dev
sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5



petalinux 2018  설치시 발생되는  python관련 오류는 

/var/lib/dpkg/status 파일을 수정함으로서 설치할수 있다.

파일 내용중 아래와 같은 부분을 찾을수 있다.

Package: python2

Status: install ok installed

Priority: optional

Section: python

Installed-Size: 136

Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>

Architecture: amd64

Multi-Arch: allowed

Source: python-defaults

Version: 2.7.17-2ubuntu4

Replaces: python (<< 2.7.15-2), python-dev (<< 2.6.5-2)

Provides: python-ctypes, python-email, python-importlib, python-profiler, python-wsgiref

Depends: python2.7 (>= 2.7.17~rc1-1~), libpython2-stdlib (= 2.7.17-2ubuntu4)

Pre-Depends: python2-minimal (= 2.7.17-2ubuntu4)

.....

이부분을 복사하고 붙여넣기 한 다음 이름만 python으로 변경해준다.
Package: python




environment: line 311: ((: 10#30+ > 10#24: syntax error: operand expected (error token is "> 10#24")
environment: line 315: ((: 10#30+ < 10#24: syntax error: operand expected (error token is "< 10#24")

2021년 1월 6일 수요일

TI 6678 부트로더 만들기

  1.  장치에 연결 후 아래 파일(eeprom 이미지) 로드
    1. C:\ti\pdk_c667x_2_0_16\packages\ti\boot\writer\eeprom\evmc6678l\bin\eepromwriter_evm6678l.out
  2. 메모리 브라우저를 이용하여 IBL 이미지 로드(0x0C000000)
    1. C:\ti\pdk_c667x_2_0_16\packages\ti\boot\ibl\src\make\bin\i2crom_0x51_c6678_le.bin
  3. 아래 경로에 i2crom_0x51_c6678_le.bin 파일의 이름을 app.bin으로 변경 후 복사
    1. C:\ti\pdk_c667x_2_0_16\packages\ti\boot\writer\eeprom\evmc6678l\bin\
  4. run
  5. 와료 되면 장치 전원 OFF -> ON

부트로더에서 사용하는 파라미터 로드
  1. 장치 연결 후 아래 파일(i2cparam_0x51_c6678_le_0x500.out)로드
    1. C:\ti\pdk_c667x_2_0_16\packages\ti\boot\ibl\src\make\bin\i2cparam_0x51_c6678_le_0x500.out
  2. Gel파일 로드(i2cConfig.gel)
    1. 기본적으로 i2cConfig.gel 파일이지만 설정 변경이 필요하면 수정해준다.
    2. C:\ti\pdk_c667x_2_0_16\packages\ti\boot\ibl\src\make\bin\i2cConfig.gel
  3. run
  4. 아래와 같이 스크립트를 실행하고 콘솔창에서 엔터를 쳐준다.
    1. 메뉴 -> Scripts -> EVM c6678L IBL -> setConfig_c6678_main




2021년 1월 4일 월요일

TI 6678 이미지 NOR에 쓰기

생성된 이미지를 NOR메모리에 쓰기

  1. msys 툴 사용하여 이미지 생성(C:\MinGW\MinGW\msys\1.0\msys)
    1. msys를 실행후 경로를 D:\projects\MTTS\MCR\SCB\Image 이동한다.
    2. 명령을 실행한다. <설정 관련 파일  maptoolCfg_SCB_C6678_bypass_prelink참고>  $ python maptool.py maptoolCfg_SCB_C6678_bypass_prelink.json bypass-prelink
    3. D:\projects\MTTS\MCR\SCB\Image\images\app.out 파일을 app.bin으로 확장자를 변경하고 C:\ti\pdk_c667x_2_0_16\packages\ti\boot\writer\nor\evmc6678l\bin 경로로 복사한다.
  2. 장치를 NO BOOT모드로 켠다.
  3. CCS -> GEL Files Load (evmc6678l.gel)
  4. 장치 연결
  5. 이미지 로드(C:\ti\pdk_c667x_2_0_16\packages\ti\boot\writer\nor\evmc6678l\bin\norwriter_evm6678l.out)
  6. Memory Browser -> Load Memory의 app.bin파일을 로드한다. 로드 잘소는 DDR의 0x8000_0000
  7. 프로그램을 Run한다.
  8. 완료 후 전원을 끄고 NOR BOOT모드 변경 후 보드에 전원을 인가한다. 







2020년 10월 6일 화요일

EDMA

Tool 정보 : ccsv9

Board 정보 : EVM C6678 


사용 라이브러리 및 Products : 

Products : c667x PDK(2.0.16), SYS/BIOS (6.76.3.01), EDMA3 Low Level Driver

라이브러리 : 


시험 설명 

DDR3 메모리에 데이터를 기록해 놓고 MSMCSRAM 메모리로 DMA를 통한 데이터 전송을 시험하낟.

소스코드 위치

https://github.com/pcw1029/tms320C6678/tree/edma

설정(XGCONF)




























결과 화면





2020년 10월 2일 금요일

DSP PDK Example 및 프로젝트 생성

 PDK에는 모든 PDK 하위 구성 요소에 대한 예제를 만들고 CCS 프로젝트를 테스트하는 데 사용되는 Windows 스크립트가 포함되어 있습니다. 다음 단계에서는 스크립트를 사용하여 CCS 프로젝트 콘텐츠를 만드는 방법을 설명합니다.

우선 gmake를 사용할수 있도록 설정해야 합니다. gmake는 xdctools의 있습니다.

제어판 -> 시스템 -> 고급 시스템 설정 -> 환경변수 -> 시스템 변수 중 Path를 편집을 이용하여 gmake Path를 추가합니다.


command창을 열고 PDK의 하위폴더인 packages로 이동하여 아래 명령을 실행합니다.

c:\ti\pdk_c667x_2_0_16\packages> pdkProjectCreate.bat C6678 all little all example dsp

실행이 완료되면 MyExampleProjects폴더가 만들어집니다.



2020년 9월 26일 토요일

Very Large FFT for TMS320C6678

Introduction

이 백서는 TI의 TMS320C6678 8 코어 고정형 DSP 코어의 1, 2, 4 및 8 DSP 코어에서 16K ~ 1024K 샘플 크기의 1 차원 복합 단 정밀도 부동 소수점 FFT를 구현하는 초대형 FFT (VLFFT) 데모에 대해 설명합니다. C66x DSP 코어의 기능과 추가 된 코어 수에 비례하는 성능 향상을 통해 여러 코어에 걸친 병렬화를 수용하는 아키텍처의 기능을 보여주기위한 부동 소수점 DSP. FFT는 의료 영상, 통신, 군사 및 상업용 레이더, 전자전 (재머, 안티 재머)과 같은 애플리케이션에 사용되는 일반적인 신호 처리 빌딩 블록이므로이 데모의 알고리즘으로 FFT가 선택되었습니다. 1024K 샘플 FFT는 알고리즘이 1GHz에서 TMS320C6678 장치의 8 개 DSP 코어 모두에서 실행될 때 6.4ms에 불과한 것으로 나타났습니다.


TMS320C6678 SoC

TMS320C6678 장치는 TI의 C66x 고정 및 부동 소수점 DSP 코어를 기반으로하는 8 코어 DSP이며 완전한 멀티 코어 권한을 지원하는 TI의 혁신적인 KeyStone ™ 아키텍처를 기반으로합니다.

최대 1.25GHz에서 작동 할 수 있으며이 속도에서 160GFLOPS를 생성 할 수 있으며 일반적인 사용 사례에서 10W 미만을 소비합니다. 또한 DSP 코어 당 512KB의 L2 메모리와 총 8MB의 온칩 메모리를위한 4MB의 공유 메모리가 있으며 모두 ECC를 사용합니다. DDR3 인터페이스는 최대 1600MTPS를 실행할 수 있으며 최대 8GB의 외부 메모리에 액세스 할 수 있으며 64 비트 + 8 비트 ECC 인터페이스입니다. 주변 장치에는 PCIe, Serial RapidIO® 및 기가비트 이더넷, 타사 IP 블록을 통해 FPGA뿐만 아니라 다른 TI DSP, ARM® 및 ARM + DSP 프로세서에 최대 50Gbps 연결을 제공하는 TI의 HyperLink 인터페이스가 포함됩니다. .

VLFFT 데모에서 TMS320C6678 장치는 1333MHz에서 DDR3 전송을 사용하여 1GHz에서 작동합니다.


VLFFT 데모

VLFFT 알고리즘을 사용하려면 입력 데이터를 장치의 외부 메모리에 배치해야합니다. 데모 중에 데이터는 DSP 코어에 의해 액세스, 배포 및 처리 된 다음 출력이 외부 메모리에 배치됩니다. 측정 된주기 수와 시간은이 전체 프로세스를 포함합니다. 다음 크기의 FFT에서 계산을 수행하기 위해 다른 수의 코어 (1, 2, 4 또는 8)를 사용하도록 소프트웨어를 구성 할 수 있습니다.

• 16K

• 32K

• 64K

• 128K

• 256K

• 512K

• 1024K

FFT 구현은 계산 부하를 여러 코어에 분산하고 C66x DSP 코어의 고성능 계산 능력을 완전히 활용하여 최대 성능을 달성하도록 설계되었습니다. 기본적인 데시 메이션-인-타임 접근법은 1 차원 매우 큰 FFT 계산을 2 차원 FFT 계산과 유사한 형태로 공식화하는 데 사용됩니다.

매우 큰 N의 경우 N = N1 * N2로 계수 될 수 있습니다. 크기가 매우 큰 경우 1 차원 입력 배열을 N1 행과 N2 열의 2 차원 배열로 나타낼 수 있으며 다음 단계를 수행하여이 표현에서 매우 큰 1 차원 FFT를 계산할 수 있습니다.

1. 열 방향에서 N1 크기의 N2 FFT 계산

2. 회전 계수로 곱하기

3. N1 크기의 N2 FFT를 행 방향으로 저장하여 N2 x N1 2 차원 배열을 형성합니다.

4. N2 크기의 N1 FFT를 열 방향으로 계산

5. 데이터를 열 방향으로 저장하여 N2 x N1 2 차원 배열 형성

이 알고리즘은 Takahashi가 "Hitachi SR8000 용 고성능 병렬 FFT 알고리즘"에서 자세히 설명합니다. [1] 멀티 코어 구현에서 1 단계는 각 코어에서 N1 크기의 N2 / (코어 수) FFT를 계산하여 수행됩니다. 각 코어에서 N1 / (코어 수) 크기 N2의 FFT를 계산하여 4 단계. 코어 0은 마스터 코어로 사용되며 모든 코어를 동기화하고 나머지 코어는 슬레이브 코어로 사용됩니다. 각 코어에서 N1 및 N2의 크기에 따라 각 코어의 총 FFT 수는 코어 당 L2 SRAM의 크기를 수용하기 위해 여러 개의 작은 블록으로 나뉩니다. 각 데이터 블록은 DMA에 의해 외부 메모리에서 L2 SRAM으로 프리 페치되고 FFT 결과는 DDR에 의해 외부 메모리에 다시 기록됩니다. 각 코어는 2 개의 DMA 채널을 사용하여 외부 메모리 (DDR3)와 내부 메모리 (L2 SRAM)간에 입력 및 출력 샘플을 전송합니다.

2020년 9월 25일 금요일

DSP GPIO Interrupt

Tool 정보 : ccsv9

Board 정보 : EVM C6678 

keystone 인터럽트 관련 참고 사이트 : 

https://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices

gpio 관련 문서 : https://www.ti.com/lit/ug/sprugv1/sprugv1.pdf

TEST_PH1(80PIN)



GPIO Memory Map Address : 

Start : 0x02320000  

End : 0x023200FF 

SIZE : 256

GPIO0 ~ GPIO15

인터럽트로 사용 GPIO -> GPIO14, GPIO15

사용 라이브러리 및 Products : 

Products : c667x PDK(2.0.16), SYS/BIOS (6.76.3.01)

라이브러리 : 

C:\ti\pdk_c667x_2_0_16\packages\ti\platform\evmc6678l\platform_lib\lib\debug\ti.platform.evm6678l.lite.lib

C:\ti\pdk_c667x_2_0_16\packages\ti\csl\lib\c6678\c66\release\ti.csl.ae66

C:\ti\pdk_c667x_2_0_16\packages\ti\csl\lib\c6678\c66\release\ti.csl.intc.ae66


시험 설명 

GPIO#13번핀을 인터럽트 신호 발생원으로 사용하고 GPIO#14, #15번을 각각 인터럽트핀으로 사용한다.

GPIO#13은 Clock함수를 이용하여 일정 주기(100msec)마다 인터럽트를 발생하고 발생된 인터럽트는 EventCombiner를 거쳐 Hwi인터럽트 설정 함수를 호출하여 인터럽트 처리를 한다.

인터럽트 처리는 Global변수를 증가하여 인터럽트 발생횟수를 확인한다.


소스코드 위치 

https://github.com/pcw1029/tms320C6678/tree/main/gpioInterrupt


TMS320C6678문서에 따르면 인터럽트 Event Number를 보면 GPIO핀은 GPIO8 ~ GPIO15을 인터럽트 사용할수 있으며, 이벤트번호 82 ~ 89까지 맵핑되어 있다.

(https://www.ti.com/lit/ds/symlink/tms320c6678.pdf 169페이지 참고)

설정(XGCONF)

  • SYS/BIOS -> Scheduling -> Hwi : 
    • Instance로 이동하여 아래 내용 설정
    • ISR Function이름, Interrupt number를 설정한다. 총 2개의 인터럽트를 생성할것이기 때문에 ADD를 눌러 인터럽트 1개를 더 추가하여 설정한다. [(인터럽트 번호는 각각 4,5를 사용할 것이며 인터럽트 0~3 예약되어 있어 사용할수 없다.)( 인터럽트가 발생되었을때 콜백될 함수는 gpio14Interrupt, gpio15Interrupt로 사용한다.)]
    • Event ID 설정 : 이벤트는 88, 89를 사용할 계획이므로 각각 88, 89를 설정한다. 이벤트 번호는 위에 그림에서 확인할수있고 또는 GPIO번호 + 74를 하면된다.

  • SYS/BIOS : Device Support로 이동하여 Event Combiner를 선택한다. 
    • Module : Add the EventCombiner module to my configuration을 체크
    • Event group 2 Hwi 항목에 6으로 설정 (이벤트 그룹 2를 선택한 이유는 event Combiner의 논리적 표현을 보면 124개의 시스템 이벤트가 있고 이를 4개의 그룹으로 나눴다. 즉 [Group#1 : event#04 ~ event#31], [Group#2 : event#32 ~ event#63], [Group#2 : event#64 ~ event#95], [Group#3 : event#96 ~ event#127]이다. Event 88,89가 GPIO인터럽트로 사용할수 있으면 이는 Event Combiner Group#2에 속해있기 때문이다. 
    • Events : Event 88, 89번의 Unmake를 false->true로 변경하고, 실행 함수명을 설정해준다. 함수명은 hwiCombinGpio14Gpio15다.

  • 프로젝트 생성시 ccs project인경우 task가 기본적으로 추가되어있으며 실험에선 사용하지 않으므로 삭제한다. 실험에서는 Clock함수를 생성하여 사용할것이기 때문이다.

  • SYS/BIOS -> Scheduling -> Clock  :  
    • Module  : Add the Clock support module to my configuration 체크
    • Instance :  Add
      • Function : gpio13InterruptOccursEveryCycle
      • Initial timeout : 50
      • Period : 50
      • Start at boot time when instance is created : 체크

보드 연결 상태


결과 화면




VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...