linux移植?linux系统移植
很多朋友对于linux移植和linux系统移植不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
如何将linux下的程序,移植到freertos中
方法/步骤
嵌入式操作系统有分时操作系统和实时操作系统,如果操作系统能够使计算机系统及时响应外部事件请求,并能控制所有实时设备和实时任务协调运行,且能在一个规定的时间内完成对事件的处理,怎么这种系统称为实时操作系统。
如果系统必须在极其严格的时间内完成的任务叫做硬件的实时操作系统,如果不是很严格的话就是软件的实时操作系统。
前往官网下载最新版的FreeRTOS系统,然后解压缩到本地。有两个文件夹,FreeRTOS文件夹里面是操作系统内核,FreeRTOS-Plus里面是一些中间件如文件系统,网络协议栈等。
值得一提的是,FreeRTOS的教学用书和API参考手册电子版均已免费提供,建议在现在安装FreeRTOS的同时也一并下载到本地,以供后期学习查阅。
FreeRTOS的主要特点如下:
1.支持抢占式调度,合作式调度和时间片调度
2.具有低功耗模式,称为tickless模式
3.FreeRTOS-MPU支持M3/M4/M7内核的MPU(内存保护单元)
4.典型的内核使用大小在4k~9k
5.支持消息队列、二值信号量、计数信号量、递归信号量和互斥信号量,可用于任务与任务之间的消息传递和同步,任务与终端间的消息传递和同步
6.任务数量不限,任务优先级数量不限
7.高效的软件定时器,不需要损耗额外的CPU时间,除非需要执行定时器任务
8.任务间直接的消息传递,速度较快
9. FreeRTOS的队列是其它通信和同步机制的基础
移植FreeRTOS之前,原有的工程(比如跑马灯,越简单越好)中不能有SysTick、PendSV和SVC三个系统中断的使用,因为FreeRTOS系统要使用这三个中断。
1.准备好简单工程的模板
2.在工程模板中创建FreeRTOS文件夹,并将解压后源码FreeRTOS文件夹中Source目录下的所有内容复制进来
3.在user目录下需要手动窗件FreeRTOSConfig.h的配置文件,也可以从官方demo中拿来修改后使用,比如从下载的源码目录下的FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK中进行拷贝
4.将源码文件添加到MDK的工程目录中,其中heap_4.c文件路径Source/portable/MemMang,port.c的路径FreeRTOS/Source/portable/RVDS/ARM_CM4F,这是因为我们使用的M451是CM4F内核的
在工程中添加新的头文件搜索路径:
.\FreeRTOS\include;
.\FreeRTOS\portable\RVDS\ARM_CM4F
打开FreeRTOSConfig.h配置文件,根据自己硬件配置进行修改
1.首先将文件开头的__ICCARM__修改为__CC_ARM,即把编译器从IAR改为RealView
2.将以下宏配置为0
configUSE_IDLE_HOOK
configUSE_TICK_HOOK
configCHECK_FOR_STACK_OVERFLOW
configUSE_MALLOC_FAILED_HOOK
3.#defineconfigUSE_PREEMPTION 1将会使能抢占式调度器
4.#defineconfigCPU_CLOCK_HZ( SystemCoreClock)设置系统主频(M451的系统主频为72MHz)
5.#defineconfigTICK_RATE_HZ(( TickType_t) 1000)设置系统节拍为1kHz,即1ms
6.#defineconfigMAX_PRIORITIES( 5)定义可供用户使用的最大优先级数为5,那么用户可以使用的优先级号是0,1,2,3,4
6.#defineconfigTOTAL_HEAP_SIZE(( size_t)( 30* 1024))定义堆大小,FreeRTOS内核,用户动态申请内存,任务栈等都需要这个空间
4.将工程整体重新编译一次,这样FreeRTOS基本移植结束了
编写测试程序来验证一致的FreeRTOS是否已经可以使用
1.在main.c中添加一下几个头文件
#include"FreeRTOS.h"
#include"task.h"
#include"queue.h"
#include"croutine.h"
2.在main函数的开头,禁止全局中断(除了NMI和HardFault),具体方法是:__set_PRIMASK(1);这样做的好处是可以防止执行的中断服务程序中有FreeRTOS的API函数,保证系统正常启动,不受别的中断影响。在port.c中的函数prvStartFirstTask中会重新开启全局中断
3.创建任务AppTaskCreate();
4.启动调度,开始执行任务vTaskStartScheduler();
烧写程序,运行,可以从串口看到正确的输出信息
linux系统移植
linux使用的是虚拟内存管理,内核与硬件MMU一起管理物理内存
4GB是32位系统的寻址极限(2的32次方),支持PAE物理地址扩展的32位CPU使用36位硬件寻址所以至多可以使用64G内存,32位操作系统加以适当改造支持PAE可以最多支持64G内存,但是每个32位进程仍然只能寻址4GB,在 Windows下某些程序如MSSQL可以通过AWE地址窗口扩展来间接使用更多的内存
32位linux里最多每个进程都认为自己拥有4G的寻址空间,其中高1G是在内核态低3G为用户态就是进程本身可以使用的空间最多3GB,但是他只是虚拟内存,,这个线性连续的内存空间被分成好几个段(segment),每个段存储不同内容如指令,堆栈,数据等等,每个段又分成的更小的单位页(page),而MMU把物理内存也分成很多的页(page), MMU维护一个表来映射物理内存的分配,进程中的虚拟页需要存储数据时产生缺页中断MMU才给分配物理内存,当物理内存分配完之后系统会使用最近最少使用(LRU)算法选择不活动的页放入交换空间(SWAP),腾出物理内存来分配给新的分配请求,如果所有可用的物理内存和交换空间都消耗殆尽,kernel还可以按照预定的规则杀死一些进程来释放内存,这时候应用程序就可能会受到影响
对于高1G位给系统,低0-3G位是用户区间,这是系统的定义,用户进程只可以操作3GB用户空间,很多的操作如读取文件则需要进行系统调用,这时进程就转入内核态运行使用的是高1G的系统代码,为了系统的可靠性这部分代码由操作系统提供,运行在CPU的特权级别,可以直接操作硬件,一旦系统调用完成进程回到普CPU通级别运行
Linux内核移植需要哪些知识点啊,求基本步骤
1、获得内核源码:从Linux内核的官网可获得相应的内核源码,这里以2.6.31.1为例。
2、解压源码,进入目录:
#tar xjvf linux- 2.6.31.1.tar.bz2
#cd linux-2.6.31.1
3、修改Makefile的183行:
ARCH?= arm<—指定系统硬件架构
CROSS_COMPILE?= arm-linux-<—指定交叉编译器
4、修改时钟:
修改arch/arm/mach-s3c2440/mach-smdk2440.c的163行
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);<—输入时钟为12MHz
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
这个一定要设置对,否则会打印出乱码。
5、修改机器码(根据实际情况,这个要和bootloader的匹配):
修改:arch/arm/tools/mach-types的379行:
s3c2440……………………… XXX<—后面那个数就是机器码(我用的天嵌开发板的机器码是168)
6、配置:
#make menuconfig<—进入图形化配置界面
在配置菜单中选择这一项:"Load an Alternate Configuration File",输入2440的默认配置文件:arch/arm/configs/s3c2410_defconfig,这个文件就是 S3C24XX系列开发板板级支持包(BSP)然后选择 OK,按回车。
进入"System Type"选项单,里面的选项保持默认在"S3C24XX Machine"选项中只配置这几项(其他的选项取消):
S3C2410 Machine--->
[*] SMDK2410/A9M2410
S3C2440 Machine--->
[*] SMDK2440
[*] SMDK2440 with S3C2440 cpu moudle
配置完后,回到主菜单,选择这一项"Save an Alternate Configuration File",输入要保存的
配置文件名称:.config(默认)或自己取名:TQ2440_config,退出,编译内核:#make zImage
说明:以后移植过程中的配置、编译,都是按这个步骤进行,但是只需要保存一次配置文件,以后就不需要再保存配置文件了,配置完后可以直接退出。
编译完后,会在arch/arm/boot下生成zImage内核镜像文件,可以修改该目录下的Makefile,在第57行下面添加:
@cp-f arch/arm/boot/zImage zImage
@echo' Kernel:$@ is ready'
这样执行make zImage后,就把生成的zImage拷到内核根目录下。
如果希望在在执行make distclean时,也同时把zImage删除,可以修改内核根目录下Makefile的第1247行,在后面加上:
-type f-print| xargs rm-f rm zImage
把 zImage镜像烧进 NandFlash跑一下,看是否正常打印出信息,如果第一步能正常引导内核,那就开始进行。然后添加驱动。
注意,系统启动最后可能会出现这个错误:
Kernel panic- not syncing: Attempted to kill init!
然后出打印出一些很乱的东西。因为用4.x.x版本的交叉编译器使用EABI,但内核默认是不支持EABI编译的,所以编译出的系统会报错,但用3. x.x版本的编译器就不会出现这个问题。解决办法是,配置内核支持EABI编译:
Kernel Features--->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel(EXPERIMENTA) 6
文章到此结束,如果本次分享的linux移植和linux系统移植的问题解决了您的问题,那么我们由衷的感到高兴!