Avatar

帮同学宣传一下http://shop57644665.taobao.com/

在Nucleus的等待事件函数EVC_Retrieve_Events中有这么一段函数

if (suspend)
{

/* Suspension is selected.  */

/* Increment the number of tasks waiting.  */
event_group -> ev_tasks_waiting++;

/* Setup the suspend block and suspend the calling task.  */
suspend_ptr =  &suspend_block;
suspend_ptr -> ev_event_group =              event_group;
suspend_ptr -> ev_suspend_link.cs_next =     NU_NULL;
suspend_ptr -> ev_suspend_link.cs_previous = NU_NULL;
task =                            (TC_TCB *) TCT_Current_Thread();
suspend_ptr -> ev_suspended_task =           task;
suspend_ptr -> ev_requested_events =         requested_events;
suspend_ptr -> ev_operation =                operation;

/* Link the suspend block into the list of suspended tasks on this
event group.  */
CSC_Place_On_List((CS_NODE **)
&(event_group -> ev_suspension_list),
&(suspend_ptr -> ev_suspend_link));

/* Finally, suspend the calling task. Note that the suspension call
automatically clears the protection on the event group.  */
TCC_Suspend_Task((NU_TASK *) task, NU_EVENT_SUSPEND,
EVC_Cleanup, suspend_ptr, suspend);

/* Pickup the return status and the actual retrieved events.  */
status =             suspend_ptr -> ev_return_status;
*retrieved_events =  suspend_ptr -> ev_actual_events;

}
else
..........

我们看到当task因为该事件而阻塞的代码

/* Finally, suspend the calling task. Note that the suspension call
automatically clears the protection on the event group.  */
TCC_Suspend_Task((NU_TASK *) task, NU_EVENT_SUSPEND,
EVC_Cleanup, suspend_ptr, suspend);

执行后紧接着的就是将等待事件的状态和接受到消息的变量进行了赋值,这是为什么呢,这样正确吗?
原来是这样的。当TCC_Suspend_Task被调用后当前task被挂起,这个函数以后的代码已经不会再接着执行了。等到这个task恢复时说明这个事件已经等到了,这个事件的值是在EVC_Set_Events函数中被设置的。

if (compare)
{

/* Decrement the number of tasks waiting counter.  */
event_group -> ev_tasks_waiting--;

/* Determine if consumption is requested.  */
if (suspend_ptr -> ev_operation & EV_CONSUME)

/* Keep track of the event flags to consume.  */
consume =  consume | suspend_ptr -> ev_requested_events;

/* Remove the first suspended block from the list.  */
CSC_Remove_From_List((CS_NODE **)
&(event_group -> ev_suspension_list),
&(suspend_ptr -> ev_suspend_link));

/* Setup the appropriate return value.  */
suspend_ptr -> ev_return_status =  NU_SUCCESS;
suspend_ptr -> ev_actual_events =
event_group -> ev_current_events;

/* Resume the suspended task.  */
preempt = preempt |
TCC_Resume_Task((NU_TASK *) suspend_ptr -> ev_suspended_task,
NU_EVENT_SUSPEND);

}

可以看到设置的返回值就是EVC_Retrieve_Events函数中的返回值。

Avatar

帮同学宣传一下http://shop57644665.taobao.com/

ARM是标准的RISC(Reduced Instruction Set Computing)即“精简指令集”,它的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。
ARM7采用三级流水线结构。ARM9采用五级流水线结构。

ARM有七种处理器模式。
一般我们的程序都是在svc模式下运行的,当中断发生时arm会自动切换到相应的模式中去。
为什么我们的程序是在svc模式下运行呢?
Q: “Why does PLUS run all tasks in Supervisor mode instead of using User Mode for tasks and Supervisor mode for PLUS system calls? ”
A: Portability and ease of use. Without having to worry about User/Supervisor mode, the PLUS function calls can be function calls. Without it, you usually have to map all of the OS function calls into some type of software trap mechanism. This complicates the system and usually adds overhead that is not needed. Also, our PLUS is a Real Time Kernel, not a full blown OS. The distinction is that a Kernel needs to be small and efficient while still providing System Calls that are robust. A Trap mechanism adds code and hurts performance.
However, AT does provide an MMU support package for selected ports that does allow for memory protection of tasks and enables application tasks to run in User Mode while the kernel runs in Supervisor mode.
从以上我们可以知道,操作系统在运行时访问某些特定的资源,比如硬件寄存器等需要arm处在特权模式下,如果我们系统是在User Mode下运行那么就需要通过手动调用swi类似的指令切换到特权模式,而如果我们的系统直接运行在svc模式下就省去了很多不必要的操作。

ARM处理器总共有37个寄存器,各个模式下可以使用的处理器如下。

其中R0-R7是unbanked register,也就是各个模式下都是同一个物理寄存器。
R8-R14是banked register,也就是各个模式都是不同的物理寄存器。一般R13做SP使用,R14为LR。
R15是PC。
ARM有一个在所有处理器模式下都可以访问的CPSR(current program status register)当前运行状态寄存器和一个在异常模式下的SPSR(saved program status register)保存的状态寄存器。我们可以通过调用MSR指令改变CPSR来手动切换处理器模式,也可以通过MRS来读取当前的处理器模式和上次保存的处理器模式。

ARM的异常及其处理
我们以一个中断发生来看ARM会做什么操作。

可见当异常发生时ARM会自动设置当前处理器模式以及自动跳转到相应地址。
各个异常的优先级是
Reset>Data Abort>FIQ>IRQ>Prefetch Abort>Undefined instruction>SWI

ARM的指令集
ARM拥有32位的ARM指令集和16为的thumb指令集。
Thumb代码所需的存储空间约为ARM代码的60%~70% - Thumb代码使用的指令数比ARM代码多约30%~40% - 若使用32位的存储器,ARM代码比Thumb代码快约40% - 若使用16位的存储器,Thumb代码比ARM代码快约40%~50% - 与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30% 显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求, 则应使用16位的存储系统和Thumb指令集。
在TI平台和MTK平台中除了bootloader外一般都是使用16位来编译源文件的。

Tagged with: .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

强烈推荐 片翼の天使 Cosmos Chaos THE MESSANGER

Title in EN :  Dissidia -Final Fantasy- Original Soundtrack
Title in JP :  ディシディア ファイナルファンタジー オリジナル.サウンドトラック

Composed by :  Takeharu Ishimoto (石元丈晴), Tsuyoshi Sekito (関戸剛), Mitsuto Suzuki (鈴木光人), Nobuo Uematsu (植松伸夫), Minoru Tsuchihashi (土橋稔)

101 「DISSIDIA-opening-」from DISSIDIA FINAL FANTASY
102 「プレリュード-menu-」from DISSIDIA FINAL FANTASY
103 「DISSIDIA-menu-」from DISSIDIA FINAL FANTASY
104 「守るべき秩序」from DISSIDIA FINAL FANTASY
105 「Cosmos」from DISSIDIA FINAL FANTASY
106 「胜利ファンファーレ-Cosmos-」from DISSIDIA FINAL FANTASY
107 「メインテーマ-arrange-」from FINAL FANTASY Ⅰ
108 「戦闘シーン-arrange-」from FINAL FANTASY Ⅰ
109 「ダンジョン-arrange-」from FINAL FANTASY Ⅰ
110 「メインテーマ-arrange-」from FINAL FANTASY Ⅱ
111 「戦闘シーン1-arrange-」from FINAL FANTASY Ⅱ
112 「戦闘シーン2-arrange-」from FINAL FANTASY Ⅱ
113 「光の戦士達」from DISSIDIA FINAL FANTASY
114 「悠久の风-arrange-」from FINAL FANTASY Ⅲ
115 「バトル2-arrange-」from FINAL FANTASY Ⅲ
116 「最后の死闘-arrange-」from FINAL FANTASY Ⅲ
117 「临戦」from DISSIDIA FINAL FANTASY
118 「ファイナルファンタジーⅣ メインテーマ-arrange-」from FINAL FANTASY Ⅳ
119 「ゴルベーザ四天王とのバトル-arrange-」from FINAL FANTASY Ⅳ
120 「バトル2-arrange-」from FINAL FANTASY Ⅳ
121 「胜利ファンファーレ-Chaos-」from DISSIDIA FINAL FANTASY
122 「4つの心-arrange-」from FINAL FANTASY Ⅴ
123 「ビッグブリッヂの死闘-arrange-」from FINAL FANTASY Ⅴ
124 「バトル1-arrange-」from FINAL FANTASY Ⅴ
125 「思惑の果て」from DISSIDIA FINAL FANTASY
126 「ティナのテーマ-arrange-」from FINAL FANTASY Ⅵ
127 「决戦-arrange-」from FINAL FANTASY Ⅵ
128 「死闘-arrange-」from FINAL FANTASY Ⅵ
129 「胎动」from DISSIDIA FINAL FANTASY
130 「进军」from DISSIDIA FINAL FANTASY

201 「F.F.7 メインテーマ-arrange-」from FINAL FANTASY Ⅶ
202 「片翼の天使-orchestra version-」from FINAL FANTASY Ⅶ
203 「更に闘う者达-arrange-」from FINAL FANTASY Ⅶ
204 「一时の安息」from DISSIDIA FINAL FANTASY
205 「Blue Fields-arrange-」from FINAL FANTASY Ⅷ
206 「Don’t be Afraid-arrange-」from FINAL FANTASY Ⅷ
207 「The Extreme-original-」from FINAL FANTASY Ⅷ
208 「敗北ファンファーレ」from DISSIDIA FINAL FANTASY
209 「あの丘を越えて-arrange-」from FINAL FANTASY Ⅸ
210 「Battle1-arrange-」from FINAL FANTASY Ⅸ
211 「Battle2-original-」from FINAL FANTASY Ⅸ
212 「マンボ de チョコボ-original-」from FINAL FANTASY Ⅴ
213 「萌动-arrange-」from FINAL FANTASY Ⅹ
214 「Otherworld-original-」from FINAL FANTASY Ⅹ
215 「ノーマルバトル-original-」from FINAL FANTASY Ⅹ
216 「勝利のファンファーレ-original-」from FINAL FANTASY Ⅴ
217 「The federation of Windurst-original-」from FINAL FANTASY XI
218 「Battle in the Dungeon #2-original-」from FINAL FANTASY XI
219 「帝国のテーマ-original-」from FINAL FANTASY XⅡ
220 「Boss Battle-original-」from FINAL FANTASY XⅡ
221 「Answer」from DISSIDIA FINAL FANTASY
222 「Chaos-Last Battle 1-」from DISSIDIA FINAL FANTASY
223 「FINAL FANTASY」from DISSIDIA FINAL FANTASY
224 「DISSIDIA-ending-」from DISSIDIA FINAL FANTASY
225  THE MESSANGER

最终幻想 纷争 OST APE格式

http://zt.tgbus.com/dff/download/2008/12/19/1505014011.shtml

Tagged with: , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

Nucleus Task的中断与恢复

以下是以TI的源代码进行的分析
一般来说最有可能中断Task的就是irq中断了。在ARM下到有中断发生时,ARM会自动切换到IRQ模式,此时ARM的寄存器已经是IRQ模式下的寄存器了。

INT_IRQ
STMDB   sp!,{r0-r5}                 ; Save a1-a4 on temporary IRQ stack
MRS     a1,spsr                     ; check for the IRQ bug:
TST     a1,#080h                    ; if the I - flag is set,
BNE     IRQBUG                      ; then postpone execution of this IRQ
SUB     r4,lr,#4                    ; Save IRQ's lr (return address)
注意r4的内容lr-4(被中断的PC,-4是因为ARM放入的是下一条指令+4)
BL      _TCT_Interrupt_Context_Save ; Call context save routine
BL      _IQ_IRQ_isr             ; Call  int. service routine
B       _TCT_Interrupt_Context_Restore

;BUG correction 2nd part  ------------------
IRQBUG: LDMFD  sp!,{r0-r5}                  ; return from interrup. Fix for locosto reset problem. We have pushed 6 regs and popping 4.
SUBS   pc,r14,#4
;BUG correction 2nd part end  --------------

以上就是一个irq的完整的处理过程了,我们慢慢来分析。 Read the rest of this post »

Avatar

帮同学宣传一下http://shop57644665.taobao.com/

Task的创建与调度

Nucleus的系统入口函数是

VOID  INC_Initialize(VOID  *first_available_memory)
{

。。。。。。。。
/* Invoke the application-supplied initialization function.  */
Application_Initialize(first_available_memory);

/* Indicate that initialization is finished.  */
INC_Initialize_State =  INC_END_INITIALIZE;

/* Start scheduling threads of execution.  */
TCT_Schedule();
}

Application_Initialize(first_available_memory);这个函数是留给平台用来初始化系统框架和创建task用的。
Task的创建一般如下

if ( NU_Create_Task (&TaskTable[Handle].TaskCB.TCB, Name, os_TaskEntry,
Handle, (VOID *)NULL,
(void*)(TaskTable[Handle].Stack+1), (ULONG) StackSize, (UCHAR) Priority,
#ifndef _TARGET_
10,
#else
0,
#endif
NU_PREEMPT, NU_NO_START) != NU_SUCCESS )
#define         NU_Resume_Task                  TCCE_Create_Task

最关键的实现是 Read the rest of this post »

Avatar

帮同学宣传一下http://shop57644665.taobao.com/

2008终于过去了,2009从头再来…..

在没有想到更好的方向之前,还是先把现在的东西做好吧。

Nucleus的源代码需要重新熟悉一遍了,对于一些对系统的运行方式有关键影响的部分是最重要的。

TI和MTK的bootloader部分需要在快速的复习一下,同时对于两个系统自己所做的中国移动的DM部分需要在复习一下,可能的话,整理一篇文档吧。

TI和MTK的系统架构可能的话写一篇比较文档。

比较需要坚持和全年的重点应该是

GSM协议栈:依据GSM spec和源代码争取把GSM协议栈的2,3层大概弄懂。

Linux内核阅读,同时结合google的android来读.

生活方面有机会多出去走走,到处去拍拍照,有机会多多锻炼身体。

Tagged with: .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

Linux 中的 barrier

#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier(); \
} while (0)

#define barrier() __asm__ __volatile__("": : :"memory")

#ifndef barrier
# define barrier() __memory_barrier()
#endif

memory_barrier 存在的原因是因为CPU的乱序执行技术。在操作系统层面上,我们有多任务,其中一个好处就是在等待磁盘等比较慢的设备反应的时候可以切换到其他任务执行, 而不是一直在那里干等浪费时间,同样,在 CPU 级别,从内存取一个数据也是非常慢的,为了避免空闲等待,可以在这个时候去分派其他指令的执行,就有可能造成乱序了,不过 CPU 最后会把得到的结果按照原来的顺序排列再返回回来,所以如果没有副作用的话,从外面是看不出来 CPU 有没有乱序执行的。 Read the rest of this post »

Tagged with: , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

编剧: 冯小刚
导演: 冯小刚
主演: 葛优 / 舒淇 / 范伟 / 徐若瑄 / 方中信
上映年度: 200812月18日
官方网站: http://www.mediaasia.com/iyato/
语言: 普通话/国语
制片国家/地区: 中国大陆
又名: If You Are the One
imdb链接: tt1330607
剧情简介   · · · · · ·
海归秦奋(葛优饰)的天才发明“分歧终端机”因能公平和平地解决人类分歧,被风投者以200万英镑高价买走。秦奋也开始踏上网上征婚的路途,一路笑话不断, Read the rest of this post »

Tagged with: , .
Page 6 of 8«12345678»