'embeded'에 해당되는 글 1387건

  1. 2018.05.09 라즈베리 2B 효용성에 대해서... 2
  2. 2018.05.08 srec_cat.exe
  3. 2018.05.04 xilinx DONE
  4. 2018.05.04 altera conf_done
  5. 2018.04.26 i2c 자료
  6. 2018.04.26 i2c mode - tm4c
  7. 2018.04.26 i2c BUS에 pull-up, pull-down
  8. 2018.04.23 rpi 3b PMIC
  9. 2018.04.22 odroid u3 저전력은 안되나..
  10. 2018.04.20 c99 inline과 extern
embeded/raspberry pi2018. 5. 9. 09:39

고민을 해보니..

apache + php + mysql + phpmyadmin 돌리는데

2.5W 정도 먹는 상황


비슷하게 설정한 odroid U3가

성능은 훨신 쾌적한데 약간 더 먹는 2.7W 정도?


라즈베리 3B+ 이런거랑 Odroid U3가 비교가 될지 모르겠지만

[링크 : https://www.datenreise.de/en/raspberry-pi-3b-and-3b-in-comparison/]


간접적으로 XU4(Exynos5422 Cortex™-A15 2Ghz and Cortex™-A7 Octa core CPUs)

Odroid U3(1.7GHz Exynos4412 Prime Cortex-A9 1.7GHz Quad-core processor)

일단 3B랑 3B+이랑 비교하면 클럭만 10% 정도 증가이기에 성능 상승폭은 그리 크지 않을 것으로 보이고

아래 벤치마크만 본다면 3b보다 u3가 나을 것으로 예상된다.

[링크 : http://www.hardkernel.com/main/products/prdt_info.php?g_code=G143452239825]

[링크 : https://magazine.odroid.com/wp-content/uploads/ODROID-Magazine-201401.pdf]


아무튼..

랜도 별도의 USB 포트를 이용하기에 라즈베리 보다 병목도 적을꺼고..

이래저래 소비전력을 따라잡은 상황에서는 라즈베리 2b 빼고 U3로 갈아타는것도 방법일 듯..

'embeded > raspberry pi' 카테고리의 다른 글

odroid u3 headless setup중 문제..  (0) 2018.05.14
rpi firmata  (0) 2018.05.11
rpi 3b PMIC  (0) 2018.04.23
rpi img 생성하기  (0) 2018.04.18
라즈베리 저전력 관련 설정  (0) 2018.04.17
Posted by 구차니
embeded/Cortex-M3 Ti2018. 5. 8. 17:03

부트로더와 어플리케이션을 합치는걸 찾는데

단순하게 SCT 파일 하나 한다고 해서 될게 아닌 듯..

일단 intel hex로 출력하고 SREG_CAT을 이용하여 붙여주어야 할 것으로 보인다.

사용자 명령을 통해 빌드 이후에 합치도록 하는게 핵심?


GENERAL: MERGING TWO APPLICATIONS INTO ONE INTEL HEX FILE

Information in this article applies to:


C51 All Versions

C166 All Versions

C251 All Versions

MDK-ARM any Version 


srec_cat.exe HexFile1.hex -Intel HexFile2.hex -Intel -o MergedHexFile.hex -Intel

[링크 : http://www.keil.com/support/docs/2666.htm]

[링크 : https://sourceforge.net/projects/hex2bin/]

[링크 : http://srecord.sourceforge.net/]

    [링크 : http://www.keil.com/forum/18063/]


IAR은 UI레벨에서 합치는게 있는 듯.. 그래서 더 비싼건가...

[링크 : https://www.iar.com/support/tech-notes/general/creating-a-bootloader-for-cortex-m/]

'embeded > Cortex-M3 Ti' 카테고리의 다른 글

CMSIS for stellaris/TM4C  (0) 2018.02.12
cortex m3 어셈블리 bl, cbz  (0) 2018.01.04
cortex-m3 keil 부트로더  (0) 2017.12.21
keil sct - 링커 스크립트  (0) 2017.12.11
lm3s 부트로더  (0) 2017.11.21
Posted by 구차니
embeded/FPGA - XILINX2018. 5. 4. 08:18

Xilinx 7 series 에도 DONE 이라는 핀이 있어서

설정이 끝나면 HIGH로 설정된다.


[링크 : https://www.xilinx.com/support/documentation/user_guides/ug470_7Series_Config.pdf]

'embeded > FPGA - XILINX' 카테고리의 다른 글

zynq runtime pl fpga update  (0) 2021.03.15
헐...? Xilinx + ARM cortex-m  (0) 2018.10.11
vivado I/O Ports 연결 컨셉  (0) 2018.03.23
vivado device constraint  (0) 2018.03.20
vivado language template  (0) 2018.03.20
Posted by 구차니
embeded/FPGA - ALTERA2018. 5. 4. 08:11

epcs에서 fpga 게이트 설정 읽어들인후

사용이 가능해지는 시점에 핀이 high로 감


[링크 : https://www.altera.com/en_US/pdfs/literature/hb/cfg/cfg_cf51001.pdf]



de0-nano 프로젝트 열어서 보니

핀으로 할당되진 않았지만 FPGA 핀 중에

D - CONF_DONE

F - nCONFIG

S - nSTATUS

등의 핀이 따로 보이긴 한다.


핀 아웃 파일에도 H14에 설정되어 있다.

[링크 : https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/dp/cyclone-iv/ep4ce15.xls]

'embeded > FPGA - ALTERA' 카테고리의 다른 글

엥.. Quartus II Lite Edition... 라이센스?  (0) 2018.05.18
Nios II 컴파일 관련  (0) 2018.05.18
quartus 프로젝트 entry point 설정  (0) 2018.04.17
Device Installer (Quartus Prime 17.1)  (0) 2018.04.17
Quartus 프로젝트 생성  (0) 2018.04.16
Posted by 구차니
embeded/i2c2018. 4. 26. 15:05


[링크 : https://www.i2c-bus.org/]


10bit address

0b11110xxM 0bxxxxxxxx

M은 Read/Write

xx 총 10비트로 7비트에서 확장하여 장치를 더 많이 사용 가능함

RW는 첫 바이트(?)에만 나오므로 두번째 바이트는 기존에 장치 register address로 쓰이던 부분임

0x78~ 0x7B(120~123) 주소로 시작하면 10비트 어드레싱으로 간주하면 된다


7비트 addressing 일 경우

0~127 까지 가능한데 그럼 7비트랑 10비트랑 어떻게 구분해야 하려나?

[링크 : https://www.i2c-bus.org/addressing/10-bit-addressing/]



반복 start 상태는 

ACK 받은 후 STOP으로 진행후 idle로 빠지는게 아니라

ACK 받은 후 START로 진행후 한번더 전송하는 상태이다.

[링크 : https://www.i2c-bus.org/repeated-start-condition/]



---

버스트

[링크 : https://blog.naver.com/specialist0/220645221966]

'embeded > i2c' 카테고리의 다른 글

linux i2c 예제  (0) 2022.12.27
i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
Posted by 구차니
embeded/i2c2018. 4. 26. 12:31

데이터시트 내용중에

Four I2C modes
– Master transmit
– Master receive
– Slave transmit
– Slave receive 
 

요런게 보이는데, 풀어 쓰다면

마스터 모드 - master가 slave로 전송 / slave가 master로 부터 받기

마스터 모드 - slave가 master로 전송 / master가 slave로 부터 받기

슬레이브 모드 - slave가 master로 전송 / master가 slave로 부터 받기

슬레이브 모드 - master가 slave로 전송 / slave가 master로 부터 받기 

요렇게 해석이 가능하다.


I2C 통신은 아래와 같이 이루어 지는데 Master에 의해서 SCL이 생성되고
마스터에 의해서 통신이 시작되고(START)

마스터가 쓰는 데이터 = 통신할 slave의 주소 + Read/Write(혹은 Receive/Send) 

슬레이브의 응답 = ACK
마스터가 쓰는 데이터 = slave의 register 주소
슬레이브의 응답 = ACK
마스터가 쓰는 데이터 = register의 data
슬레이브의 응답 = ACK

마스터에 의해서 통신이 종료되게 된다.(STOP)


 

I2C 레지스터 관련 내용 





Driverlib에 정의된 내용

#define I2C_MASTER_CMD_SINGLE_SEND                                            \

                                0x00000007

#define I2C_MASTER_CMD_SINGLE_RECEIVE                                         \

                                0x00000007

#define I2C_MASTER_CMD_BURST_SEND_START                                       \

                                0x00000003

#define I2C_MASTER_CMD_BURST_SEND_CONT                                        \

                                0x00000001

#define I2C_MASTER_CMD_BURST_SEND_FINISH                                      \

                                0x00000005

#define I2C_MASTER_CMD_BURST_SEND_STOP                                        \

                                0x00000004

#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP                                  \

                                0x00000004

#define I2C_MASTER_CMD_BURST_RECEIVE_START                                    \

                                0x0000000b

#define I2C_MASTER_CMD_BURST_RECEIVE_CONT                                     \

                                0x00000009

#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH                                   \

                                0x00000005

#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP                               \

                                0x00000004

#define I2C_MASTER_CMD_QUICK_COMMAND                                          \

                                0x00000027

#define I2C_MASTER_CMD_HS_MASTER_CODE_SEND                                    \

                                0x00000013

#define I2C_MASTER_CMD_FIFO_SINGLE_SEND                                       \

                                0x00000046

#define I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE                                    \

                                0x00000046

#define I2C_MASTER_CMD_FIFO_BURST_SEND_START                                  \

                                0x00000042

#define I2C_MASTER_CMD_FIFO_BURST_SEND_CONT                                   \

                                0x00000040

#define I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH                                 \

                                0x00000044

#define I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP                             \

                                0x00000004

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START                               \

                                0x0000004a

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT                                \

                                0x00000048

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH                              \

                                0x00000044

#define I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP                          \

                                0x00000004


#define I2C_O_MCS               0x00000004  // I2C Master Control/Status 


void

I2CMasterControl(uint32_t ui32Base, uint32_t ui32Cmd)

{

    //

    // Check the arguments.

    //

    ASSERT(_I2CBaseValid(ui32Base));

    ASSERT((ui32Cmd == I2C_MASTER_CMD_SINGLE_SEND) ||

           (ui32Cmd == I2C_MASTER_CMD_SINGLE_RECEIVE) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_START) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_SEND_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_START) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_QUICK_COMMAND) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_SINGLE_SEND) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_START) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH) ||

           (ui32Cmd == I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP) ||

           (ui32Cmd == I2C_MASTER_CMD_HS_MASTER_CODE_SEND));


    //

    // Send the command.

    //

    HWREG(ui32Base + I2C_O_MCS) = ui32Cmd;



값대로 정렬하면 아래처럼 나오는데

CONT 0x01

START 0x03

STOP 0x04

FINISH 0x05

_SINGLE_ 0x07

로 끝나게 된다.


I2C_MASTER_CMD_BURST_SEND_CONT 0x00000001


I2C_MASTER_CMD_BURST_SEND_START 0x00000003


I2C_MASTER_CMD_BURST_SEND_STOP 0x00000004

I2C_MASTER_CMD_BURST_SEND_ERROR_STOP 0x00000004

I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP 0x00000004

I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP 0x00000004

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_ERROR_STOP 0x00000004


I2C_MASTER_CMD_BURST_SEND_FINISH 0x00000005

I2C_MASTER_CMD_BURST_RECEIVE_FINISH 0x00000005


I2C_MASTER_CMD_SINGLE_SEND 0x00000007

I2C_MASTER_CMD_SINGLE_RECEIVE 0x00000007


I2C_MASTER_CMD_BURST_RECEIVE_CONT 0x00000009

I2C_MASTER_CMD_BURST_RECEIVE_START 0x0000000b


I2C_MASTER_CMD_HS_MASTER_CODE_SEND 0x00000013


I2C_MASTER_CMD_QUICK_COMMAND 0x00000027

I2C_MASTER_CMD_FIFO_BURST_SEND_CONT 0x00000040

I2C_MASTER_CMD_FIFO_BURST_SEND_START 0x00000042

I2C_MASTER_CMD_FIFO_BURST_SEND_FINISH 0x00000044

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_FINISH 0x00000044

I2C_MASTER_CMD_FIFO_SINGLE_SEND 0x00000046

I2C_MASTER_CMD_FIFO_SINGLE_RECEIVE 0x00000046

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_CONT 0x00000048

I2C_MASTER_CMD_FIFO_BURST_RECEIVE_START 0x0000004a 



+

데이터시트에는 존재하지 않는 오프셋 주소다.. ㄷㄷ

burst mode랑 multibyte랑 다른거 같긴한데 모르겠네..

#define I2C_O_MBLEN             0x00000030  // I2C Master Burst Length

#define I2C_O_MBCNT             0x00000034  // I2C Master Burst Count 


I2CMCS에 write 레지스터는.. 0x10까지만 공개되어 있네?

#define I2C_MCS_BURST           0x00000040  // Burst Enable 


공개가 안된건.. 해당 칩셋에서는 burst mode 사용불가인거 겠지?



state라고 하긴 애매한데

idle(통신을 잡지 않은 상태)

start (SDA,SCL Low, 통신 시작)

transmit(address LSB에 Write)

receive(address LSB에 Read)

stop (통신을 놓음)

repeat start(통신을 놓지 않고 다른 장치나 주소로 통신)

run (ACK 이후에 stop이나 transmit/recieve로 가는 상태)


이러한 상태들이 존재하게 된다.

그림으로 그리려니 참 애매해지네


그런 이유로... i2c 구현시에 함수들이 uart 처럼 단순하지 않고

토막토막 나있는 것으로 보인다.


I2CMasterControl()은

i2c driver의 state machine을 통제하고

i2c 로직에서는

장치 주소와, 데이터를 가지고 있고

state machine의 값을 이용해

어떤식으로 데이터를 보낼지 결정하게 된다.

(그래서 더 복잡한 듯)


+

2018.04.27

그러니까.. 1 byte를 기준으로 보내는데

바이트 별로 설정을 해줘야하고

그 설정에 통신을 끝낼지 이어서 전송을 할게 있는지를 설정해주는게 은근복잡했던 것..

'embeded > i2c' 카테고리의 다른 글

linux i2c 예제  (0) 2022.12.27
i2c 자료  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
Posted by 구차니
embeded/i2c2018. 4. 26. 12:27

MCU 데이터시트를 보다보니 신기한거(?) 발견

I2C 에서 SCL/SDA에 둘다 풀업이 걸려있다.


그리고 HIGH->LOW로 가면서 통신이 이루어지게 된다.


혹시나 해서 봤는데..

UART 역시 TX 기준 HIGH에서 LOW로 떨어트린 다음 시작하게 된다.


SSI는... LOW에서 HIGH 가네?




아무튼 얼추 주워들은 이야기라 근거, 출처를 아직 못 찾아 봤지만

어떤 의미로 통신은

한쪽에서 전압을 떨구거나 올리는 스위치를 통해 이뤄지는 것이라 pull-up, pull-down이 중요하다고 한다.


I2C의 경우에는 Pull-up으로 통신라인이 구성되고

데이터를 보내기 위해서는 I2C Driver에서 내부적으로 GND로 돌려주는 작업을 하면 

BUS 라인내에서 간단하게 Logical 0과 1을 표현할 수 있고

받는 쪽에서도 rising edge나 falling edge를 탐지하면 인터럽트로 처리가 가능하니

통신이란 거진 이런 양상을 뛰는 걸지도?


SSI같이 Low에서 High로 가는건

Pull-down으로 구성하고, 드라이버 내에서 logical 1을 표현시에는

Driver에 인가되는 Vcc를 스위칭 해주는 것으로 구현될 것으로 추측된다.

'embeded > i2c' 카테고리의 다른 글

i2c 자료  (0) 2018.04.26
i2c mode - tm4c  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
i2c 정리  (4) 2012.01.10
I2C  (2) 2011.11.28
Posted by 구차니
embeded/raspberry pi2018. 4. 23. 14:16

오.. 어떤식으로 쓸 수 있을지 모르겠지만

라즈베리 3B 되면서 PMIC가 장착되었다고 한다.


근데 벤치상에... 3B는 그나마 양호한데..

3B+의 자비없는 대기전력.. ㄷㄷ (생각해보면 Odroid U3 급이긴 한데 성능은 누가 나으려나?)

[링크 : https://www.raspberrypi.org/magpi/raspberry-pi-specs-benchmarks/]


Witty Pi 라는 HAT은 RTC와 Power on/off 기능 추가

전원 버튼이 HAT에 추가되고 그걸 누르면 On 되고

On 상태에서 Off를 누르면 라즈베리가 SW적으로 종료절차를 따르게 된다.

Suspend도 지원하는 매력적인 녀석 (23.04USD 꽤 쎄네...)

[링크 : http://www.uugear.com/witty-pi-realtime-clock-power-management-for-raspberry-pi/]

  [링크 : https://www.raspberrypi.org/forums/viewtopic.php?t=149008]


I2C를 켜라고 하는것 봐서는 I2C를 통해 리눅스에게 전원 On/Off 상태를 알려주도록 되어 있는 듯?

Please notice that sudo is necessary to run this script. This script will automatically do 

these tasks in order:

1. Enable I2C on your Raspberry Pi

2. Install i2cctools, if it is not installed yet

3. Configure Bluetooth to use minicUART (Raspberry Pi 3 only)

4. Install wiringPi, if it is not installed yet

5. Install Witty Pi programs, if they are not installed yet

[링크 : http://www.uugear.com/doc/WittyPi_UserManual.pdf]



3B+은 2018년 3월 출시되었고

CPU 클럭 1.2->1.4로 상향

기가비트 이더넷 추가, PoE Ready

802.11ac 추가

의 차이가 존재한다.

[링크 : https://www.datenreise.de/en/raspberry-pi-3b-and-3b-in-comparison/]

'embeded > raspberry pi' 카테고리의 다른 글

rpi firmata  (0) 2018.05.11
라즈베리 2B 효용성에 대해서...  (2) 2018.05.09
rpi img 생성하기  (0) 2018.04.18
라즈베리 저전력 관련 설정  (0) 2018.04.17
라즈베리 파이 배포용 이미지 만들기  (0) 2018.02.23
Posted by 구차니
embeded/odroid2018. 4. 22. 15:30

문의를 했는데

일단.. 정체 불명의(?) 스위치는 power off시(shutdown 명령을 통한) 다시 켜는 용도

음.. 그럼 꾸욱 누르고 있으면 강제 종료 되려나?



그리고 max_freq를 500~600MHz에 거버너 performance라는데

기본이  performance고 1.7GHz인데


$ sudo cpufreq-set -f 500000 

$ sudo cat cpuinfo_cur_freq 500000

위의명령을 통해서 변경하고 확인해봐도 소비전력이 2.35W 이하로 떨어지진 않는다.

내가 모르는 다른 무언가가 있는건가?



governor는 performance로 맞추고 max_freq를 500~600Mhz 정도로 변경하면 1.5Watt까지 줄어들것 같습니다.

물론 USB 장치의 소비전류는 별도로 생각한 경우입니다.


SW1은 Power Off 상태에서 보드의 전원을 켤때 사용합니다.

오드로이드 보드는 Suspend/Resume같은 sleep 기능을 지원하지 않습니다. 

[링크 : http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidu2&bid=8238]


HDMI mini 컨버터를 두고 와서 확인을 못하는데..

켜져있는 상태에서 스위치를 누르니.. Xorg가 45%로 치솟는다.

전원 OFF UI를 그려준다고 난리피는걸까?


+

2018.04.23

음.. 말그대로 전원스위치로 인식을 하는 듯?

문득.. 리눅스 쪽으로 전원 스위치를 어떻게 인식시키는지 궁금해지네?



한참 있다가 죽어 버렸네..

power off/on 기능을 겸하는 듯

(다만 오프라인에서 켤수 없으면 죽은걸 살릴수 없으니 별 의미는 없네)

'embeded > odroid' 카테고리의 다른 글

오랫만에 지름!  (2) 2018.09.07
odroid eMMC / SD 리더 호환성  (0) 2018.05.14
odroid u3 mediawiki 설치해보니..  (0) 2018.04.19
odroid u3 소비전력 재측정  (0) 2018.04.17
odroid u3 boot.ini  (0) 2018.04.17
Posted by 구차니
embeded/Cortex-M4 Ti2018. 4. 20. 09:39

예전에도 찾았다가 해결은 못한거 같은데

일단 간단하게 결론만 말하자면


__inline 대신에

estern __inline으로 선언하면 해결된다.

(__inline에서 호출되는 변수/함수들에 static이 되어있으면

이걸 다 따라가서 static 없애는 것 보다는 옳은 방향으로 보임)



error:  #1059-D: an entity with internal linkage cannot be referenced within an inline function with external linkage


internal linkage

internal linkage를 가지는 이름은 외부 translation unit으로 공개되지 않는다. internal linkage를 가지는 이름은 다음과 같다.


namespace scope에 선언된 static specifier가 붙은 이름

namespace scope에 선언된 anonymous union의 데이터 멤버

namespace scope에 선언된 const 혹은 constexpr이 붙고 volatile은 아닌 변수

unnamed namespace에 선언된 모든 이름



external linkage

 위에서 설명한 internal linkage와 다르게 external linkage를 가지는 이름은 다른 translation unit과 공유된다. 다시 말해서 어떤 이름이 external linkage를 가진다면 그 이름은 서로 다른 translation unit에서 사용되더라도 같은 내용을 가져야 한다.


namespace scoep에 선언 된 이름 중 internal linkage가 아닌 이름.

block scope에 선언된 함수

block scope에 선언된 변수 중에서 extern으로 선언된 변수 

[링크 : https://blog.seulgi.kim/2017/08/cpp-linkage.html]


Internal Linkage: An identifier implementing internal linkage is not accessible outside the translation unit it is declared in. Any identifier within the unit can access an identifier having internal linkage. It is implemented by the keyword static. An internally linked identifier is stored in initialized or uninitialized segment of RAM.  


External Linkage: An identifier implementing external linkage is visible to every translation unit. Externally linked identifiers are shared between translation units and are considered to be located at the outermost level of the program. In practice, this means that you must define an identifier in a place which is visible to all, such that it has only one visible definition. It is the default linkage for globally scoped variables and functions. Thus, all instances of a particular identifier with external linkage refer to the same identifier in the program. The keyword extern implements external linkage.

When we use the keyword extern, we tell the linker to look for the definition elsewhere. Thus, the declaration of an externally linked identifier does not take up any space. Extern identifiers are generally stored in initialized/uninitialized or text segment of RAM. If uninitialized, the value of the identifier is set to 0 by the kernel.

[링크 : https://www.geeksforgeeks.org/internal-linkage-external-linkage-c/]


That looks perfectly fine under the C99 rules. Because stack.c is compiled with both an extern and inline declaration of the function, it will be defined with external linkage and can also be inlined within that file.


Other files will have only the declaration, and so will link to the version with external linkage.


Note that the function isn't allowed to define any modifiable objects with static storage duration, or reference any functions or global variables that aren't extern. 

[링크 : https://stackoverflow.com/.../how-to-define-a-function-to-be-inline-internal-and-external-copy-in-c99]


If you specify both inline and extern in the function definition, then the definition is used only for inlining. In no case is the function compiled on its own, not even if you refer to its address explicitly. Such an address becomes an external reference, as if you had only declared the function, and had not defined it.


This combination of inline and extern has almost the effect of a macro. The way to use it is to put a function definition in a header file with these keywords, and put another copy of the definition (lacking inline and extern) in a library file. The definition in the header file causes most calls to the function to be inlined. If any uses of the function remain, they refer to the single copy in the library. 

[링크 : https://gcc.gnu.org/onlinedocs/gcc/Inline.html]


C99 inline semantics are often misunderstood. The inline specifier serves two purposes:


First, as a compiler hint in case of static inline and extern inline declarations. Semantics remain unchanged if you remove the specifier.


Second, in case of raw inline (ie without static or extern) to provide an inline definition as an alternative to an external one, which has to be present in a different translation unit. Not providing the external one is undefined behaviour, which will normally manifest as linking failure.

[링크 : https://stackoverflow.com/questions/16245521/c99-inline-function-in-c-file]


translation unit은 C++ compilation의 기본 단위입니다. <소스 파일 하나 + 직접/간접적으로 include된 헤더파일의 내용물(전처리기 조건에 따라 몇몇은 무시)>로 구성되어 있습니다.


translation unit 한개는 object file, library나 실행가능한 프로그램으로 컴파일 될 수 있습니다. 

[링크 : http://hashcode.co.kr/questions/1244/translation-unit에-대해서]


A translation unit is the basic unit of compilation in C++. It consists of the contents of a single source file, plus the contents of any header files directly or indirectly included by it, minus those lines that were ignored using conditional preprocessing statements.


A single translation unit can be compiled into an object file, library, or executable program.


The notion of a translation unit is most often mentioned in the contexts of the One Definition Rule, and templates. 

[링크 : https://stackoverflow.com/questions/1106149/what-is-a-translation-unit-in-c]


2016/04/12 - [embeded/Cortex-M4 Ti] - keil/c99 에서 __inline ...?


Posted by 구차니