Распечатка 7.6 Эффективная блокировка — 2

Предыдущая  Содержание  Следующая V*D*V

Распечатка 7.6.

 

/* hello.c */

 

#include <stdio.h>

 

/*

 * Определяем макросы для использования раздела атрибутов GCC.

 * Для хранения нашего кода, данных и bss реального времени мы

 * определяем 3 раздела, real_text, read_data и real_bss

 */

#define __rt_text __attribute__ ((__section__ ("real_text")))

#define __rt_data __attribute__ ((__section__ ("real_data")))

#define __rt_bss __attribute__ ((__section__ ("real_bss")))

 

/*

 * Компоновщик очень легко поддаётся доработке. Он обычно

 * определяет символы, содержащие начальные и конечные адреса

 * разделов. Компоновщик определяет следующие символы

 */

extern unsigned long __start_real_text, __stop_real_text;

extern unsigned long __start_real_data, __stop_real_data;

extern unsigned long __start_real_bss, __stop_real_bss;

 

/* Инициализированные данные для раздела real_bss */

char rt_bss[100] __rt_bss;

 

/* Неинициализированные данные для раздела real_data */

char rt_data[] __rt_data = "Hello Real-time World";

 

/* Функция, которая пойдёт в раздел real_text */

void __rt_text hello_rt_world(void){

  printf("%s", rt_data);

  memset(rt_bss, 0xff, sizeof(rt_bss));

  return ;

}

 

/* Наконец, блокируем в памяти наши разделы

 * ‘реального времени’

 */

void rt_lockall(void){

  mlock(&__start_real_text,

        &__stop_real_text – &__start_real_text);

  mlock(&__start_real_data,

        &__stop_real_data - &__start_real_data);

  mlock(&__start_real_bss,

        &__stop_real_bss - &__start_real_bss);

}

 

/* Функция, не работающая в реальном времени */

void hello_world(void) {

  printf("hello world");

  return;

}

 

int main(){

  rt_lockall();

  hello_world();

  hello_rt_world();

  return 0;

}

 

Предыдущая  Содержание  Следующая