RT-Thread移植到or1200芯片

发布于 2020-05-20 23:40:31    浏览:401
or1200是openrisc架构的处理器。
移植步骤:
一、用户级别的任务切换rt_hw_context_switch,在目录中添加contextgcc.S代码
rt_hw_context_switch((rt_uint32_t)&from_thread->sp,
(rt_uint32_t)&to_thread->sp);
从rt_hw_context_switch调用来看,传入的参数有两个
1、 旧的线程的SP
2、 新的线程SP
根据数据手册
[img=706,314][/img]
可以知道,第一个参数放到r3, 第二个放到r4

这样的话再做任务切换时候,旧线程切换出去后(入栈),需要更新旧线程的SP,然后新线程出栈前,需要把新线程的SP赋值给CPU的sp。

二、系统第一次发生调度rt_hw_context_switch_to
  rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
从调用来看,在汇编里只要实现,to_thread的出栈就可以了。


三、中断级别的任务切换,在interrupt.c中添加
void rt_hw_context_switch_interrupt(rtuint32 from, rtuint32 to)
{
if (rt_thread_switch_interrput_flag == 1)
rt_interrupt_from_thread = from;
else
rt_interrupt_from_thread = 1;
rt_interrupt_from_thread = to;
}
实现了用户中断的init,install、mask、unmask、handler.
这个rt_interrupt_from_thread用于判断中断退出后是否切换更高优先级已就绪任务。

四、线程的栈顺序部分
rt_uint32_t *rt_hw_stack_init(void * p_task, void *p_arg,rt_uint8_t *p_stk_base, void *texit)

五、系统定时器

在timer.c实现了系统定时器的初始化以及处理函数。

六、uart驱动

七、移植代码
[github]( https://github.com/dreamflyforever/rt-thread)
目录 libcpu/openrisc/or1200

总结:
1、任务切换部分:包括用户级别的和中断级别的,什么是中断级别的任务切换?就是说中断退出后,判断需不需要切换到更高优先级已就绪任务运行,对于优先级抢占式操作系统是必须做的。

2、中断部分:异常向量表,汇编中跳转中断处理,用户中断的注册、中断处理、屏蔽、使能。

3、系统定时器:是系统的心脏,可以作为一些对象的timeout、delay的一个标准。

4、stack_init:定义了栈的顺序,任务切换时进栈出栈的一个标准顺序。

5、数据类型定义:这个根据编译器来写就可以了

6、uart: 方便调试


PS:6年前玩的,希望能对人类有所帮助,谢谢!

查看更多

0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
401

发布
问题

分享
好友

手机
浏览

扫码手机浏览