在S3C2440上移植FreeRTOS

发布者:TranquilGaze最新更新时间:2024-08-01 来源: cnblogs关键字:S3C2440  移植  FreeRTOS 手机看文章 扫描二维码
随时随地手机看文章

简介:

FreeRTOS-Kernel V10.5.1 | gcc version 6.5.0 (crosstool-NG 1.24.0) 在官方已有的ARM7_LPC2000的移植模板文件基础上修改(FreeRTOS-Kernel/portable/GCC/ARM7_LPC2000)使用heap4。

移植调度器:

初始化一个定时器用于提供系统心跳时钟。选择初始化定时器4的周期为1ms,配置为fiq。在prvSetupTimerInterrupt()中调用初始化函数如下图:

在vPortISRStartFirstTask()中添加汇编函数如下:目的是在启动第一个函数前切换处理器到特殊模式,简而言之就是要切换到非系统或用户模式,因为这里portRESTORE_CONTEXT()的实现中修改了r14寄存器,如果执行时处于系统或用户模式恢复函数上下文的时候就会跑飞。因为我将定时器4设置为fiq,所以这里我选择了快中断模式。

最后将vTickISR( void )和vPortYieldProcessor( void )分别注册为fiq和swi的中断服务函数,移植就基本完成了。

解决中断嵌套:

因为fiq可以打断irq和swi的执行,然而我的裸机中断服务函数并没有实现中断嵌套的功能,所以如果在irq或swi中断服务函数执行的过程中发生fiq中断切换函数的时候就会跑飞,如上图所示,目前的解决办法是在fiq中断服务函数中添加代码判断进入中断前处理器的状态,即检查spsr_fiq中保存的值,如果不是系统模式就只调用xTaskIncrementTick()函数,保持RTOS心跳tick的准确,在非中断嵌套的场景再执行任务切换。


改进:

在fiq中判断中断是否嵌套后可以设置一个标志位在r8~r12中,在fiq退出前切换处理器状态检测这个标志位并执行任务切换,达到类似pendSV的效果。(swi中断本身就是为了切换任务所以不需要再调度一次)


关键字:S3C2440  移植  FreeRTOS 引用地址:在S3C2440上移植FreeRTOS

上一篇:s3c2440 gcc交叉编译工具链制作
下一篇:从nfs启动最小文件系统

推荐阅读最新更新时间:2024-11-09 15:05

s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
前提: norflash初始化正常,能够正常从nor上执行。 cpu总是从0地址读取指令执行程序。当cpu设置成nor启动时,0地址对应nor。cpu从nand启动时,0地址对应sram。 1.读取norFlash 我们将板子设为nor启动,那么0地址对应nor,我们先将uboot烧写到nor中。我们先看下这款NorFlash的手册,找到操作flash的命令表: 下面简单的举一些例子: 1)复位(reset): 往任何一个地址写入F0即可。 2)读ID: 很多的Nor Flash可以配置成位宽16bit(Word),位宽8bit(Byte),我们这款norflash数据位宽为16bit。下面我们按照nor手册上的命令表
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
存储器类型与S3C2440启动地址
前言 本文记录的是S3C2440启动地址和各种存储器类型 一、存储器类型 思维导图如图所示: 二、探究S3C2440启动地址 1.为什么nand启动地址是4096? 指令:ldr sp, = 4096 因为S3C2440的nand控制器会自动把nand flash中前4K代码数据搬到内部SRAM(0x4000,0000)中,同时还把这块SRAM地址映射到0x0000,0000地址。CPU从0x0000,0000位置开始运行程序。 2.为什么nor启动地址是0x4000,0000 + 4096? 指令:ldr sp, = 0x4000,0000 + 4096 ①堆栈的启示地址是最高处地址。 ②0x4000,000
[单片机]
存储器类型与<font color='red'>S3C2440</font>启动地址
Linux驱动:s3c2410/s3c2440 ts驱动分析
前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统、s3c2440的ADC转换和触摸控制器。 涉及的寄存器 image.png 调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 s3c2410ts_probe函数分析 1. 硬件寄存器设置 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( struct s3c2410_ts_mach_info *)pdev- dev.platform_data;
[单片机]
u-boot-2009.08在mini2440上的移植(一)---建立mini2440工程环境(1)
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,参考文章: http://blogold.chinaunix.net/u3/101649/showart.php?id=2105215 http://blog.chinaunix.net/space.php?uid=23787856&do=blog&id=115382
[单片机]
u-boot-2009.08在mini2440上的<font color='red'>移植</font>(一)---建立mini2440工程环境(1)
autossh 移植到arm
一、环境介绍 1.1 宿主机 Ubuntu 1404 32 位 1.2 嵌入式平台 ATMEL AT91SAM9X25 1.3 交叉工具链 arm-none-linux-gnueabi autossh源码下载地址 二、交叉编译 tar xvf autossh-1.4b.tgz cd autossh-1.4b/ ./configure --prefix=$PWD/tmp --host=arm-none-linux-gnueabi --build=i686-linux make make install 执行完安装之后,将安装目录的可执行文件拷贝到目标板即可
[单片机]
s3c2440之外部中断
对s3c2440的硬件操作无非就是配置寄存器,中断也不例外: 需要设置的寄存器: GPGCON :引脚配置寄存器,设置为第二功能,中断引脚; EINTPEND:中断挂起寄存器,当有中断发生且没有被屏蔽,相应位会自动置1,在进入中断服务程序后必须用软件将其相应位清0以免发生错误中断; SRCPND:源挂起寄存器由32位组成,其每一位都涉及一个中断源。如果中断源产生了中断则相应的位被置1并且等待中断服务。此寄存器指示出是哪个中断源正在等待请求服务。 注意:此寄存器不顾INTMAST的屏蔽位,由硬件自动将相应中断位置1,在进入中断服务程序后必须通过写1清除相应位,以防发生错误中断。 EINTMASK:外部中断屏蔽
[单片机]
<font color='red'>s3c2440</font>之外部中断
(6)s3c2440用I2C接口访问EEPROM
在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的I2C接口来访问EEPROM,只要按照datasheet的来做,基本上不用考虑时序咯. 从s3c2440和AT24
[单片机]
Linux2.6.32移植到MINI2440(2)添加Nand Flash驱动,修改分区
开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 一、添加头文件 在/arch/arm/mach-s3c2440/mach-mini2440.c中 vim mach_mini2440.c 添加进去如下头文件: #include linux/mtd/partitions.h #include linux/mtd/nand_ecc.h #include linux/mtd/mt
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved