标签 操作系统 下的文章
 2016-04-02T22:23:40.457000    |      Linux MMC子系统    |     AilsonJack    |     暂无评论    |     3715 views
最近看了看preempt-rt的一些材料,觉得网友的总结还是可以,这里就分享出来供大家学习之用,总结的几个preempt-rt关键点如下:1、preemptible critical sections1.1 用支持PI的rt_mutex代替传统的禁用抢占的spin_lock,定义了新的数据类型:spin_lock_t。凡是使用spin_lock_t做参数的spin_lock函数行为有可能引起调度,不会禁用抢占。如果,希望使用传统的spin_lock,则需要使用raw_spin_lock_t类型作为参数。1.2 同时,要注意per CPU变量的问题,以前用spin_lock保护的per CPU变量,现在会出现问题,即在现在的spin_lock中进程照样会睡眠,然后调度到别的CPU上。因此,引入了一个新的宏来定义一种可以锁住的per CPU变量。DEFINE_PER_CPU_LOCKED,就是这样的宏,通过get_cpu_var_locked来操作per CPU变量。不过,以前使用get_cpu/put_cpu保护的per CPU变量不受影响。1.3 还有一种情况,就是在显示的改变的进程状态之后,调用spin_lock,参考下面的代码序列:spin_lock(&mylock1);    current->state = TASK_UNINTERRUPTIBLE;    spin_lock(&mylock2); // [*]        blah();    spin_unlock(&mylock2);spin_unlock(&mylock1);在锁住mylock2之前,进程被设置为TASK_UNINTERRUPTIBLE状态,但是现在spin_lock的行为与mutex一样,所以当获得mylock2的时候,进程有可能被设置为TASK_RUNNING状态,则与前面的逻辑相矛盾。所以,引入了TASK_MUTEX_RUNNING状态。这样,代码会选择将进程状态设置为以前的状态还是TASK_RUNNING。2、preemptible interrupt handlers在preempt-rt环境下,中断处理程序是运行在进程上下文中的,这与传统情况大相径庭,所以处理上有很多需要注意的地方。大概的过程是,redirect_hardirq唤醒某个中断处理程序(实际上是一个进程),然后交由do_irqd在进程上下文中执行。如果,希望某个中断处理程序继续运行在中断上下文中,需要将该中断处理程序设置为SA_NODELAY。在这种情况下,任何于进程上下文的互斥都要使用raw_spin_lock_t来处理。3、preemptible “interrupt disable” code sequence在preempt-rt环境下,spin_lock_irqsave并不会禁用中断和抢占,而且local_irq_save也不会禁用中断,只会禁用抢占。必须与SA_NODELAY类型中断打交道的代码不能使用local_irq_save,因为它不会真正禁用中断,此时,必须使用raw_local_irq_save。4、priority inheritance for in-kernel spinlocks and semaphore对于preempt-rt中的spinlock来说,实现都是支持PI的rt_mutex,即能够解决优先级翻转问题。优先级翻转是实时系统中比较严重的问题,具体成因是:进程A,B,C,其中优先级A>B>C。C持有锁S,A需要S,则A睡眠在S上,但是B抢占C,则A只有等到B运行结束,C释放S后才能继续运行。这样就造成了优先级翻转问题。解决办法是,在A尝试获得S的时候,判断持有S的进程与A的优先级,如果A的优先级更高,则提升C的优先级与A一样高。如果,C还依赖于某一个锁,这样循环下去,则需要循环提升持有锁的进程的优先级。当C释放S时,恢复C的优先级。一旦,C释放S,则A尝试获得S,这时S在pending状态,这时,更高优先级的进程可以尝试抢占A,否则A将彻底获得S。这种优化通过在spin_lock_t中加入task_struct指针实现,指针的低两位作为锁的状态位。在pending向held状态转化过程中,是更高优先级进程“steal”锁的时机。在这个例子里面,A就是S的top waiter。针对于读写锁,由于依赖情况比较负责,preempt-rt做了简化,即只容许一个进程在一个时间持有一个读锁。但是,这里面也有例外,某些用于同步的semaphore,不能执行PI,因为,不知道哪个进程持有这个semaphore,所以无法比较优先级。这种情况需要使用compat_semaphore或者compat_rw_semaphore代替。5、deferred operations由于spin_lock可以睡眠,因此在禁用抢占期间代用spin_lock是非法的。在这种情况下preempt-rt提供了一些解决办法:put_task_struct_delayed排队put_task_struct稍后执行;mmdrop_delayed排队mm_drop稍后执行;TIF_NEED_RESCHED_DELAYED执行重调度,在进程准备返回到用户空间时,或者直到下一个preempt_check_resched_delayed。6、latency-reduction measurespreempt-rt中还有一些改变的主要目的是减少调度或中断延迟。第一个例子是x86的MMX/SSE硬件。这些硬件在内核中处理时禁用抢占,需要等待前面的指令完成,但是一些指令执行时间很长,preempt-rt做了改变。第二个例子是使用slab分配器分配per CPU变量。
Linux内核学习操作系统RTOS 阅读全文»
 2015-12-12T21:34:58.506625    |      实用技巧    |     AilsonJack    |     暂无评论    |     4930 views
最近用自己的U盘做系统盘后发现U盘的容量由原来的15GB变为现在的4MB,对它进行格式化也没法恢复到以前的容量,这可怎么用啊。因此在网上找了下相关的解决方法,这里结合自己的U盘,给大家讲讲,希望给有需要的人一些帮助吧。上面两幅图就是我的U盘目前的容量,格式化也不起作用,真是够了,下面就来说说解决方法吧。1、查看隐藏的大小右键计算机,选择管理,之后选择磁盘管理,可以看到我目前的U盘有15GB没有分配,难怪U盘容量变得这么小了:2、打开分区工具按下<win + R>键打开运行,输入diskpart,打开分区工具:3、查看U盘的磁盘号输入命令list disk,列出磁盘列表。我这里有两个磁盘,其中磁盘1是需要进行格式化的U盘:4、选中磁盘1我的U盘的磁盘号是磁盘1,因此我要选中磁盘1进行操作,输入命令:select disk=1,磁盘1现在是所选磁盘。再输入list disk,列出磁盘列表时,磁盘1前有*号,表示被选中。这一步重要,务必确定被选中的是U盘:5、清除磁盘1 的空间在选中了磁盘1之后,输入命令:clean,清除磁盘1的空间,提示Diskpart成功地清除了磁盘:6、后续步骤在第1步打开的磁盘管理窗口中,右击磁盘1,选择新建简单卷,接下来按步骤操作:点击下一步:点击下一步:点击下一步:点击下一步:点击完成:此时可以看到U盘的空间恢复了:
实用技巧操作系统 阅读全文»
 2015-04-29T14:54:37.519808    |      ARM11    |     AilsonJack    |     暂无评论    |     1743 views
这篇文章教大家如何一步一步的安装Linux系统到自己的ARM11开发板,文章参考了一些资料,在这里记录下,也方便以后自己查找。  注:在进行下面的操作之前,请先下载相关文件。文件:点此下载 密码:3svv。1、烧写BIOS准备一张4G的SD卡和一个读卡器(我这里用的是一张8G的SD卡),插上电脑,然后将其格式化:接着以管理员的身份打开我提供给大家的一个工具SD-Flasher.exe,点击scan按钮,检测到了SD卡,如果没有以管理员身份打开SD-Flasher.exe,那么可能检测不到SD卡:在Image File to Fuse…中找到我提供给大家的superboot-20101223.bin文件:最后点击Fuse按钮,之后点击Quit按钮:到这里,BIOS的烧写已经完成,将SD卡插到ARM11开发板的SD卡插槽,然后将启动开关拨到SDBoot,连接好开发板与电脑的串口线,打开SecureCRT,给开发板上电,SecureCRT上面显示的信息如下:2、安装USB连接线驱动由于我的电脑是Windows 7 64位的,在这一步中安装USB驱动虽然成功了,但是插上开发板后,识别不了USB设备,因此我使用的是虚拟机中装Win XP来解决这个问题。Win 7 32位系统不知道行不行,你们自行试试吧,实在不行的话,就用VirtualBox装一个XP系统吧。先双击FriendlyARM USB Download Driver Setup_20090421,进行驱动安装,这一步就是单纯的下一步,下一步,很简单的,就不上截图了。打开DNW软件,可以看到图中的USB:x,表明USB连接还没建立起来:接着拿出开发板配套的USB线,插到开发板和电脑上,此时开发板在第一步中已经上电了,此时DNW软件上显示的是USB:ok,表明USB连接已经建立:3、安装Linux系统(1)、格式化Nand Flash打开SecurtCRT,输入f选项,回车:(2)、安装BootLoader在SecurtCRT中输入v,此时处于等待DNW发送数据的状态:点击DNW软件中USB Port下的Transmit/Restore选项,在弹出的窗口中,找到我提供给大家的安装映像文件,这里根据自己的机型选择文件,我这个开发板是256MB的内存,所以我这里选择的是u-boot_nand-ram256.bin文件:(3)、安装Linux内核在SecurtCRT中输入k,同样的使用DNW,选择文件zImage_s70,我的开发板搭配的触摸屏型号是S70,你们也根据自己的实际情况选择吧:(4)、安装文件系统在SecurtCRT中输入y(或者u),同样的使用DNW,选择文件rootfs_qtopia_qt4.img(或者rootfs_qtopia_qt4.ubi),这个文件有点大,所以花费的时间要长一些:(5)、重启开发板断开开发板的电源,然后将开关拨到NAND,给开发板上电,可以看到Linux系统已经安装成功了。至此,安装Linux系统到ARM11开发板已经完成了,大家有什么不明白的地方,欢迎留言,如果力所能及一定帮忙啦。
LinuxARMARM11操作系统 阅读全文»
 2015-03-30T10:39:04.482064    |      Linux问题集合    |     AilsonJack    |     暂无评论    |     983 views
今天,我给大家讲讲如何用VMWare安装Linux操作系统。这里我选择的是Fedora 14操作系统,为什么会选择安装Fedora 14,不为别的,因为它是我第一个用的Linux发行版,并且对于学习后面的ARM11来说,也是一个不错的开发系统,嵌入式开发学习我还是比较喜欢Windows搭配VMWare。如果纯粹的使用的话,我还是比较喜欢追新,比如我在实体机上安装了opensuse 13.2,Fedora 21,当然还有Windows啦。其实该教程不仅可以用来作为VMWare安装其他Linux系统的教程。而且也可用于作为在实体机上安装Fedora 14的操作指南,特别是后面对于硬盘分区,可以作为一个参考,不过如果对于从没在实体机上进行过Linux安装的朋友,还是在网上搜索下相关教程吧,不然你电脑里的资料没了不要找我哦。注:以下操作需要使用Fedora 14的镜像文件,这里我就不提供了,大家可以在网上搜索下载即可,我这里用的是Fedora 14的64位系统。还有当然是需要VMWare啦,大家就自己下载安装吧,很简单的。1、新建虚拟机打开VMWare,然后点击文件 –> 新建虚拟机,弹出的窗口选择见下图,都是一步一步来的哟:注:我的改动内容和截图一样,然后就是点击下一步。最后点击完成按钮:2、安装Fedora 14(1)、右击刚新建的虚拟机,点击设置,在弹出的窗口中,切换到CD/DVD(IDE),连接中选择使用ISO映像文件,然后添加下载好的Fedora 14镜像文件,最后点击确定按钮:(2)、点击开启此虚拟机进行Fedora 14的安装:(3)、安装Fedora 14操作系统:注:在VMWare界面中,想要自己的鼠标可以移动到自己真实的系统,按住ctrl+alt即可。还有,下面的操作一般情况下按照默认选项操作,有改动的我都进行了说明。接下来就进入到了Fedora 14的安装界面,点击Next:接下来,就涉及到了对磁盘进行分区,我这里的分区方案是:/boot     :360MBswap      :2000MB/       :剩下的所有空间首先创建挂载/boot的分区:接下来创建swap分区:最后创建挂载根目录(/)的分区:接下来就进入到了系统安装的过程,大家等待它安装完成即可。系统安装完成了,点击重新引导,体验一下吧:重新引导后会让你创建用户及一些其他的配置,这些都很简单,就不贴图讲解了。至此,就完成了在VMWare中安装Fedora 14的讲解。
Linux问题集合VMWare操作系统 阅读全文»
 2015-03-22T17:07:49.298401    |      STM32    |     AilsonJack    |     暂无评论    |     1344 views
相信大家使用STM32或者其他芯片的时候,绝大部分时间都是在写裸机程序,不过偶尔会写一些带系统的程序,那么问题来了,这个系统怎么选,又怎么移植呢?今天我给大家讲讲如何移植μCOS-II这个嵌入式系统到STM32下工作,为什么选μCOS-II,因为目前对它比较熟的嘛,而且也适合使用在像STM32这种处理器上。下面就是移植的过程,有图哟。关于移植过程中的一些基础知识,我想大家应该知道上网搜索学习吧。  在移植之前,先下载要用到的μCOS-II的官方移植版本。地址:点此下载 密码:euom。1、首先在Keil下建立STM32库函数工程如果还不会在Keil下建立STM32库函数工程,或者记不清了,可以参考我的博文:Keil下建立STM32库函数工程,这里有详细的说明,也是带图教程哦。2、在工程下,建立存放系统文件的目录在搭建好的工程下,建立一个UCOS-II的文件夹,然后在该文件夹下,再新建两个文件夹:SRC、PORT,效果如下:3、拷贝源码的相关文件到相应的目录注:UCOS-II\SRC下的代码是 ucosii 中无需修改部分,UCOS-II\PORT下的代码是移植时需要修改的。(1)、把Micrium\Software\uCOS-II\Source下的文件拷贝至Test\UCOS-II\SRC:(2)、把Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR下的文件拷贝至 Test\UCOS-II\PORT,把Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD下的os_cfg.h文件拷贝到Test\UCOS-II\PORT文件夹下:4、配置Keil工程(1)、在Keil下建立如下组,然后添加对应文件到组下:(2)、添加相应的头文件路径:5、修改移植时需要修改的文件(1)、os_cpu.h:注释掉os_cpu.h文件中下面的这三个函数:void OS_CPU_SysTickHandler(void); void OS_CPU_SysTickInit(void); INT32U OS_CPU_SysTickClkFreq(void);(2)、os_cpu_c.c:把下面这些宏定义也注释掉,把 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()也注释掉:(3)、os_cpu_a.asm:PUBLIC  OS_CPU_SR_Save  ; Functions declared in this filePUBLIC  OS_CPU_SR_RestorePUBLIC  OSStartHighRdyPUBLIC  OSCtxSwPUBLIC  OSIntCtxSwPUBLIC  OS_CPU_PendSVHandler将以上的PUBLIC改为EXPORT,如下图:将RSEG CODE:CODE:NOROOT(2)修改为:;RSEG CODE:CODE:NOROOT(2)AREA |.text|, CODE, READONLY, ALIGN=2THUMBREQUIRE8PRESERVE8如下图:(4)、os_dbg.c:将该文件中的#define  OS_COMPILER_OPT  __root修改为:#define  OS_COMPILER_OPT  //__root,修改结果如下:(5)、startup_stm32f10x_hd.s:搜索startup_stm32f10x_hd.s中的PendSV_Handler,然后用OS_CPU_PendSVHandler把所有出现PendSV_Handler的地方替换掉,总共三个地方:(6)、os_cfg.h:对其做如下修改:#define OS_APP_HOOKS_EN 0#define OS_DEBUG_EN 0#define OS_EVENT_MULTI_EN 0#define OS_SCHED_LOCK_EN 0#define OS_TICK_STEP_EN 0#define OS_TASK_CHANGE_PRIO_EN 0#define OS_TASK_QUERY_EN 0#define OS_TASK_STAT_EN 0#define OS_TASK_STAT_STK_CHK_EN 0#define OS_TASK_SUSPEND_EN 0#define OS_FLAG_EN 0#define OS_MBOX_EN 0#define OS_TIME_DLY_RESUME_EN 0#define OS_TIME_GET_SET_EN 0#define OS_TIME_TICK_HOOK_EN 0#define OS_TMR_EN  0所做的修改主要是把一些功能给去掉,减少内核大小,也利于调试。等移植完成后,如果需要该功能,再做开启。(7)、stm32f10x_it.c:在该文件引用头文件:#include “ucos_ii.h”在void SysTick_Handler(void) 函数中添加如下代码:OSIntEnter();OSTimeTick();OSIntExit();(8)、ucos_ii.h:注释掉#include <app_cfg.h>:(9)、main.c:在main.c文件中引用ucos_ii.h文件:#include “ucos_ii.h”main.c文件中的代码如下:上述代码创建了两个任务,实现了PC6与PC7的IO口电平切换。仿真结果如下图:至此,在STM32上移植μCOS-II的工作就完成了,接下来,你就可以在这个工程下建立自己的应用程序。
ARMSTM32嵌入式操作系统μCOS 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154778 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号