apollo_logo
4
0

技术文档|如何创建Apollo内核

从开发者出发,对手教你如何使用Apollo自动驾驶技术,给自动驾驶研究实践的开发者带来切实的帮助,加速每一位开发者的研发过程。本文将介绍如何创建Apollo内核。Apollo 内核提供了运行 Apollo 软件堆栈所需的内核级支持。在第一个版本中,我们在 Linux 目录下添加了最流行的解决方案 Linux Kernel。

区别

(1)实时补丁

(2)最新的 e1000e 英特尔以太网驱动程序

(3)实时补丁下 Nvidia 驱动程序的错误修复

(4)在inet_csk_clone_lock 函数补丁中双重释放5.其他 cve 安全补丁

(5)基于 Ubuntu 的 config-4.4.0-X-generic 为 Apollo 修改内核配置文件

添加 ESD CAN 支持

需要添加 ESD CAN 驱动程序才能使用 ESD CAN 卡运行 Apollo 软件。

下载发布包

从 Github 上的发布部分下载发布包:

https://github.com/ApolloAuto/apollo-kernel/releases

安装

tar zxvf linux-4.4.32-apollo-1.0.0.tar.gz
cd install
sudo ./install_kernel.sh

建造

如果您想定制和构建自己的内核,只需运行:

./build.sh

可以在目录下找到安装内核包:

./install/rt

示例

(1)设置实时调度策略和优先级;

(2)锁定内存,使由虚拟内存引起的页面错误不会破坏确定性行为;

(3)预先故障堆栈,以便将来的堆栈故障不会破坏确定性行为

以下示例包含带有实时抢占补丁的实时应用程序的一些非常基本的示例代码。编译如下:

gcc -o test_rt test_rt.c -lrt

源代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sched.h>
#include <sys/mman.h>
#include <string.h>
#define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50
as the priority of kernel tasklets
and interrupt handler by default */
#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is
guaranteed safe to access without
faulting */
#define NSEC_PER_SEC (1000000000) /* The number of nsecs per sec. */
void stack_prefault(void) {
unsigned char dummy[MAX_SAFE_STACK];
memset(dummy, 0, MAX_SAFE_STACK);
return;
}
int main(int argc, char* argv[])
{
struct timespec t;
struct sched_param param;
int interval = 50000; /* 50us*/
/* Declare ourself as a real time task */
param.sched_priority = MY_PRIORITY;
if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
perror("sched_setscheduler failed");
exit(-1);
}
/* Lock memory */
if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
perror("mlockall failed");
exit(-2);
}
/* Pre-fault our stack */
stack_prefault();
clock_gettime(CLOCK_MONOTONIC ,&t);
/* start after one second */
t.tv_sec++;
while(1) {
/* wait until next shot */
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
/* do the stuff */
/* calculate next shot */
t.tv_nsec += interval;
while (t.tv_nsec >= NSEC_PER_SEC) {
t.tv_nsec -= NSEC_PER_SEC;
t.tv_sec++;
}
}
}

原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
区别
添加 ESD CAN 支持
下载发布包
安装
建造
示例