#include <chrono>
#include <functional>
#include <memory>

#include "geometry_msgs/msg/twist.hpp"
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/laser_scan.hpp"

using namespace std::chrono_literals;
using std::placeholders:: _1;

class Sample{
    public:
        Sample(): ranges_size(0){};
        void LaserScanCallback(const sensor_msgs::msg::LaserScan::SharedPtr _msg){
            this->ranges_size = _msg->ranges.size();
            std::cout << this->ranges_size << std::endl;
        }
    private:
        unsigned int ranges_size;
};
class MovingRobot: public rclcpp::Node{
    public:
        MovingRobot(): Node("moving_robot"){
            sample_ptr_ = std::make_shared<Sample>();

            laserscan_subscription_ = this->create_subscription<sensor_msgs::msg::LaserScan>(
                "/scan", rclcpp::QoS(rclcpp::SystemDefaultsQoS()),
                std::bind(&Sample::LaserScanCallback, sample_ptr_.get(), _1));
        }
    private:
        rclcpp::Subscription<sensor_msgs::msg::LaserScan>::SharedPtr laserscan_subscription_;

        std::shared_ptr<Sample> sample_ptr_;
};

int main(int argc, char* argv[]){
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MovingRobot>());
    rclcpp::shutdown();

    return 0;
}

핵심은 subscription callback 등록할때 bind 함수에서 this 포인터 대신 클래스의 포인터를 등록

'etc' 카테고리의 다른 글

colcon graph  (0) 2025.01.16
Python Package Offline Install  (0) 2024.01.18
Fix client coordinates and set camera projection in Gazebo  (0) 2023.11.20
Open source software Project License  (0) 2021.07.28
Adaptive AUTOSAR vs Classic AUTOSAR  (0) 2021.01.19

workspace dependency visualization

colcon graph --dot > graph.dot  
dot -Tpng graph.dot -o graph.png  

 

graph.png

sample code

// Sample code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){

    srand(time(NULL));

    int count = 0;

    for(;;){
        int random_number = rand() % 100;

        if(random_number > 95)
            break;
        else if(random_number > 100)
            continue;
        else
            count++;
    }

    printf("count : %d\n", count);

}

build & execute

gcc --coverage -o coverage coverage.c
./coverage
  • --coverage 옵션으로 컴파일 하고, 실행하면 같은 경로에 .gcda, .gcno 파일이 생성된다.
  • gcda: 커버리지 정보 및 실행 횟수가 포함(동일경로에 생성되지만 -fprofile-dir 옵션으로 경로 설정 가능)
  • gcno: 기본 블록 그래프를 재구성하고 블록에 소스 라인 번호를 할당하는 정보가 포함.(동일경로에 생성)

analysis

gcov

gcov coverage.c 
// 같은 경로에 coverage.c.gcov 파일 생성

cat coverage.c.gcov
/*
        -:    0:Source:coverage.c
        -:    0:Graph:coverage.gcno
        -:    0:Data:coverage.gcda
        -:    0:Runs:1
        -:    1:#include <stdio.h>
        -:    2:#include <stdlib.h>
        -:    3:#include <time.h>
        -:    4:
        1:    5:int main(){
        -:    6:
        1:    7:    srand(time(NULL));
        -:    8:
        1:    9:    int count = 0;
        -:   10:
       28:   11:    for(;;){
       29:   12:        int random_number = rand() % 100;
        -:   13:
       29:   14:        if(random_number > 95)
        1:   15:            break;
       28:   16:        else if(random_number > 100)
    #####:   17:            continue;
        -:   18:        else
       28:   19:            count++;
        -:   20:    }
        1:   21:    printf("count : %d\n", count);
        -:   22:
        -:   23:}
*/
  • 가장 왼쪽 숫자는 해당라인 실행횟수이며 #####은 미실행 라인

gcovr

  • gcov 파일을 시각화 하여 파싱해주는 툴
gcovr --html-details -r . --html coverage.html
gcovr -r . --csv coverage.csv
gcovr -r . --json coverage.json

 

 

'리눅스' 카테고리의 다른 글

Transparent Huge Page  (0) 2024.03.20
get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

C언어에서의 생성자 및 소멸자

  • main 함수 전후로 실행됨
  • OS에서 제공하는 기능은 아니고 어플리케이션 레벨에서 main함수 전후로 실행되기때문에, exit 함수등으로 프로그램 정상종료시 소멸자가 실행되지만 프로세스 강제종료시 소멸자가 실행되지 않음
  • gcc 제공기능이라 비쥬얼 스튜디오에서 안된다.
  • 여러개의 생성자를 사용 가능하며 prioirity로 순서 지정 가능(0 ~ 100번은 예약된 우선순위라 101번부터 지정가능)
#include <stdio.h>

void __attribute__((constructor (101))) my_constructor1(void) {
    printf("this is my_constructor1()\n");
}

void __attribute__((constructor (102))) my_constructor2(void) {
    printf("this is my_constructor2()\n");
}


void __attribute__((destructor (102))) my_destructor1(void) {
    printf("this is my_destructor1()\n");

}

void __attribute__((destructor (101))) my_destructor2(void) {
    printf("this is my_destructor2()\n");
}


int main(void) {

    printf("this is main()\n");

    return 0;
}
/*
this is my_constructor1()
this is my_constructor2()
this is main()
this is my_destructor1()
this is my_destructor2()
*/

'C&C++' 카테고리의 다른 글

Errno Setting Function List  (0) 2024.01.17
CMake Syntax  (0) 2020.01.21
How To Use Unit Test In C++  (0) 2020.01.13
WINAPI How To Hook ConnectEx  (0) 2019.11.06
WINAPI DLL_PROCESS_DETACH  (1) 2019.08.08

About Transparent Huge Page

리눅스에서 메모리를 관리할 때 사용하는 페이지의 크기는 일반적으로 4kb이다. 
이 페이지를 통해 메모리를 분할하여 관리하는데, 메모리의 크기가 커질수록 페이지 수가 많아진다.
이렇게 되면 페이지를 관리하는 TLB(Translation Lookaside Buffer)의 크기도 비례하여 커지는데 이를 방지하는 기법이 THP(Transparent Huge Page)이다.
THP를 통해 페이지의 크기를 증가시키고(기본적으로 4kb -> 2mb), 이렇게 되면 페이지의 갯수가 줄어들어 TLB의 크기도 작아지는 방식이다.

메모리가 100기가 이상인 서버급 컴퓨터에서 THP를 활용하거나, 
메모리 집약적인 워크로드를 수행하는 동작에 대해서 THP를 활용하는 경우에는 성능적으로 큰 효과가 있을 수 있지만, 
일반적으로 데스크탑 PC나 임베디드 보드의 경우에는 오히려 성능 저하를 야기할 수 있다.
때문에 리눅스가 동작하는 하드웨어의 스펙에 따라 THP를 끄는게 성능적으로 좋은 경우도 있다.

일반적인 PC급 HW나 서버급 워크스테이션에서는 THP가 조건부 적용되도록 설정되어있지만, 임베디드 보드의 경우 기본적으로 사용하는것으로 설정되어있다.

How to disable THP

# check whether enabled or disabled
cat /sys/kernel/mm/transparent_hugepage/enabled

# [always] madvise never

# always: madvise() 시스템콜에 인자로 MADV_NOHUGEPAGE 옵션을 전달하지 않은 모든 프로세스가 THP 사용
# madvise: madvise() 시스템콜에 인자로 MADV_HUGEPAGE 옵션을 전달한 프로세스가 페이지 폴트시 THP 사용
# never: 시스템에서 THP를 완전하게 비활성화

# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-configuring_transparent_huge_pages

###############################################################

# turn off once
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# turn off completely
vi /etc/systemd/system/disable-thp.service

# disable-thp.service contents
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target


systemctl daemon-reload
systemctl start disable-thp
cat /sys/kernel/mm/transparent_hugepage/enabled
systemctl enable disable-thp
reboot

'리눅스' 카테고리의 다른 글

How to measure code coverage using gcov  (0) 2024.04.24
get realtime output of ssh remote command  (0) 2023.11.08
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

download package(online)

pip3 download --platform linux_aarch64 pyelftools
  • 설치된 pyelftools 설치 압축파일을 설치목적지로 복사

install package(offline)

pip3 install --no-index --find-links pyelftools-xxxxxxxxxxxxxxxx.whl pyelftools

offline pip upgrade

pip3 download pip # online
python pip-xxxxxxxx.whl/pip install --no-index pip-xxxxxxxxxx.whl # offline

Functions That Set errno and Return an Out-of-Band Error Indicator

Function Name Return Value Error Value
ftell() -1L  Positive 
fgetpos(), fsetpos() Nonzero Positive
mbrtowc(), mbsrtowcs() (size_t)(-1) EILSEQ
signal() SIG_ERR Positive
wcrtomb(), wcsrtombs() (size_t)(-1) EILSEQ
mbrtoc16(), mbrtoc32() (size_t)(-1)  EILSEQ
c16rtomb(), c32rtomb() (size_t)(-1)  EILSEQ 

 

 

Functions that Set errno and Return an In-Band Error Indicator

Function Name Return Value Error Value
fgetwc(), fputwc() WEOF EILSEQ
strtol(), wcstol() LONG_MIN or LONG_MAX ERANGE
strtoll(), wcstoll() LLONG_MIN or LLONG_MAX ERANGE
strtoul(), wcstoul() ULONG_MAX ERANGE
strtoull(), wcstoull() ULLONG_MAX ERANGE
strtoumax(), wcstoumax() UINTMAX_MAX ERANGE
strtod(), wcstod() 0 or ±HUGE_VAL ERANGE
strtof(), wcstof() 0 or ±HUGE_VALF ERANGE
strtold(), wcstold() 0 or ±HUGE_VALL ERANGE
strtoimax(), wcstoimax() INTMAX_MIN, INTMAX_MAX ERANGE

'C&C++' 카테고리의 다른 글

How to use constructor and destructor in C language  (0) 2024.04.24
CMake Syntax  (0) 2020.01.21
How To Use Unit Test In C++  (0) 2020.01.13
WINAPI How To Hook ConnectEx  (0) 2019.11.06
WINAPI DLL_PROCESS_DETACH  (1) 2019.08.08

fix gazebo client coordinates

vi ~/.gazebe/gui.ini
[geometry]
x=0
y=0
width=1754
height=1043

set camera projection

vi warehouse.world
<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <include>
      <pose>4 1 30 0 0 0</pose>
      <uri>model://sun</uri>
    </include>
    <model name="warehouse">
      <include>
        <pose>0 0 0 0 0 0</pose>
        <uri>model://warehouse</uri>
      </include>
    </model>
    <gui fullscreen='0'>
      <camera name='user_camera'>
          <pose frame=''>0 0 0 0 1.57 0</pose>
          <!--projection_type orthographic or perspective-->
          <projection_type>orthographic</projection_type>
      </camera>
    </gui>
  </world>
</sdf>

'etc' 카테고리의 다른 글

colcon graph  (0) 2025.01.16
Python Package Offline Install  (0) 2024.01.18
Open source software Project License  (0) 2021.07.28
Adaptive AUTOSAR vs Classic AUTOSAR  (0) 2021.01.19
소프트웨어 마에스트로 10기 후기  (4) 2020.01.15

passwordless ssh setting

ssh-keygen -t rsa -b 4096
ssh-copy-id user@remote_ip

get realtime output of ssh remote command

ssh user@remote_ip "cd __; stdbuf -oL ./test"

'리눅스' 카테고리의 다른 글

How to measure code coverage using gcov  (0) 2024.04.24
Transparent Huge Page  (0) 2024.03.20
Core dump not generated  (0) 2023.06.13
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04

sysctl -w kernel.core_pattern=core


echo core >/proc/sys/kernel/core_pattern

'리눅스' 카테고리의 다른 글

Transparent Huge Page  (0) 2024.03.20
get realtime output of ssh remote command  (0) 2023.11.08
Linux Signal List  (0) 2021.06.10
How to use ctags  (0) 2020.11.04
How to construct reverse proxy and load balancer using Nginx  (0) 2020.04.27

+ Recent posts