摘要:
三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1.0.0 (Mar 12 2006 - 20:51:12)Lichee RTOS code: 0C100000 -> 0C1021EC BSS: -> 0C102228上面这句说明执行代码开始位置和结束位置,以及全局数据的结束位置。Init Finish!这里就是初始化任务完成。pTask=C102234这里就分配第一个IDLE任务内存位置。pTask->pStackStart=C10225C这个是任务的栈底的位置。 阅读全文
摘要:
关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个程序输出打印内容,这样在打印机上就会乱得不得了,同时有两份以上的文件交错地打印在一张纸上。像不可剥夺的资源,就一定要关闭中断,让它占有这个资源。在ARM里,没有像x86那样有清除中断指令CLI。那么在ARM里是怎么样实现关中断和开中断的呢?下面就来看看ARM的关中断和开中断实现。/////////////////////////////////////////////////////////////////////////////////函数名称: Lock//函数 阅读全文
摘要:
OS任务切换源程序分析 先要声明任务指针,因为后面需要使用。 //任务指针.volatile TASK_TCB* volatile g_pCurrentTask = NULL; volatile TASK_TCB* volatile g_pCurrentTask1 = NULL;volatile TASK_TCB* volatile g_pCurrentTask2 = NULL;接着就需要初始化这些任务栈,用下面的代码进行初始化,为了简单,全部使用内存地址操作的方式,当然后面会改成动态地分配内存的方式。代码如下:///////////////////////////////////////// 阅读全文
摘要:
OS的任务切换有了前面的Tick中断,那么基本的任务切换条件已经是“万事俱备,只欠东风”了。不过,这个“东风”也是很难搞得懂的,只有不断地通过实践才会找到合适的方法。现在我就需要去找这个东风了,就是解决不同的任务切换的问题。从简单到复杂,这是任何事物的认识过程,也是行之有效的方法。绝对不要一上来就搞一个很复杂的,因为人的理解能力还是有限的。最简单的任务切换,就是我需要实现的:只需要实现两个任务不断地来回切换,就已经说明可行了。那我先把这两个任务设置为最简单的,因此,就把任务的栈定下来,因为每个任务的栈是肯定不同的,所以我选择了固定地设置栈地址。比如第一个任务的栈地址是0x0c700000,第二 阅读全文
摘要:
使用TICK中断经过许多天的努力,总算可以使用中断了,但为了让RTOS可以使用定时中断,那么在S3C44B0里有什么样的中断可以实现呢?在S3C44B0里有两种方法可以实现这样中断,一种是通过定时器中断,一种是通RTC的TICK定时中断。由于S3C44B0片内已经有提供给RTOS的中断,就应使用它作为RTOS的中断,这样可以使时间片跟RTC时钟是时间同步。RTOS调度任务是通过设置时间片中断实现的。当时间片到达时,就向CPU发出中断信号,CPU就会把当前任务状态保存下来,然后转到中断进程运行,并且在中断里放着的是进行优先选择运行任务的程序,接着从中断返回时就可以运行不同的任务了。既然这个中断那 阅读全文
摘要:
上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中断是否打开的。 这几个寄存器如下:1. 程序状态寄存器(CPSR).这个寄存器里有两位可以控制是否响应FIQ或IRQ中断的设置。如果把这两位全部置1,就全部不响应中断了。后面会用到这两位来关中断的,在RTOS里就需要使用到这两位关中断作为临界区。2. 中断控制寄存器(INTCON)这个寄存器只使用到低3位:0,1,2。第0位设置为1时,不使用FIQ的中断;设置为0时,就是使用FIQ的中断。第1位设置为1时,不使用IRQ的中断;设置为0时,就是使用IRQ的中 阅读全文
摘要:
因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序,然后不断地调试。在这个程序之前,先要深入去了解ARM的中断方式,知道它有7种工作方式。下面先看初始化的代码是怎么样初始化不同模式栈的。/* IRQMODE。 */ orr r1,r0,#0x12|0xc0msr cpsr,r1ldr sp,=IRQ_MODE_SP_START这段代码,就是初始化IRQ模式的栈,这样在IRQ中断时就可以使用栈了。S3C44B0的中断过运行过程是这样的:当有中断发生时,就会跳到FLASH中的地址0x18处理取到一条指令并执行,因 阅读全文
摘要:
ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采用中断比以往的查询方式占用更少的CPU时间,让系统提供更好性能。那么中断在S3C44B0中是怎么样的呢?在开发ARM程序中是怎么样进行响应的呢?这就是我需要学习的东西。查询S3C44B0的手册,发现它有7种工作模式,每种工作模式是不一样的。其中最常用的,就是SVC和IRQ模式。在使用中断之前,一定要初始化每种模式的栈指针SP,如果不初始化,肯定会出错。在CPU进行初始化时,就需要依次进入IRQ模式,初始化SP,接着再进入SVC模式初始化SP。这样这两种模式,就 阅读全文
摘要:
使用GCC来开发ARM,就一定遇到编译器的问题。比如遇到编译C代码各种警告和错误。像我昨天就遇到了几个警告,那么就来看看这几个警告是什么引导的呢?警告如下:armlib/memory.c: 91 warning: cast increases required alignment of target type这个警告是什么意思呢?从字面上来看,就是类型转换时,引起目标类型的存储方式排列改变。比如从一个char*指针转换为一个int*指针,就出这样的警告。比如:char* pTest1;int* pTest2;pTest = (int*)pTest1;这种转换就会有警告出现。当然这种警告是设置了 阅读全文
摘要:
由于在LINUX下开发还是比较麻烦,那么在WINDOWS下有没有更加方便简单的开发方法呢?答案是肯定的。当然不是选择ADS这样的开发工具,因为它成本太贵。就算使用盗版,也不会觉得心安理得,那么就要采用其它方案了。目前只有选择GCC的开发工具。经过不断地努力,总找到合适的ARM开发工具。它就是WINARM,采用它来开发,就大提高了工作效率,使写起代码来更加方便,编译更加快速,出错更容易修改,并且比较便宜,又可作为商业使用。采用GCC编译器后,编译程序发了一个警告,它如下:init.h 13:29: warning: no newline at end of file这个出错的意思,就是在文件尾没 阅读全文