RT-Thread简介

RT-Thread 设备分层
RT-Thread类继承(逻辑上)
RT-Thead设备模型

RT-Thread简介

1.关键词

国产,嵌入式操作系统

RT-Thread:内核,网络,fs,gui

开发环境:MDK 5.14,stm32f103芯片数据

2.rt-thread启动

int $$Sub$$main()

{

    rt_hw_interrupt_disable();

    rthread_startup();

    return 0;

}

rtthread_startup()

---rt_hw_board_init()  硬件平台初始化

---rt_show_version()

---rt_system_timer_init()

---rt_system_schduler_init()

---rt_system_signal_init()

---rt_application_init()

------rt_thread_create/rt_thread_init("main", main_thread_entry) 创建用户main

()执行线程

---rt_system_timer_thread_init()

---rt_thread_idle_init()

---rt_system_schduler_start() 启动调度器,系统开始执行起来

裸机启动:

SystemInit()=》Main()

linux启动:

bootloader:如u-boot,以svc模式,实模式启动,解决“无中生有”问题,没有什么

就建立临时的,反正后面内核还要更新数据。arm把默认的0x00000000作为reset入口

,初始化CP15,lowlevel_init=>(C代码)

_main:board_init_f,board_init_r=>main_loop=>boot_os[].

u-boot同样可以初始化需要的设备,驱动设备工作,所以u-boot就是一个在裸机上执

行的小系统,这点和SystemInit, RT-Thead的初始化类似。

内核启动step1:

此为汇编部分,编译时候定好了内核加载的物理地址,u-boot在do_bootm_linux中解

析images,得到内核image的入口地址赋值给*kernel_entry(0, machid, bootargs),

执行kernel_entry跳转,移交控制权限。

进入kenel入口,要求(arm)【1.mmu off; 2.D-cache off, I-Cache off; 3.

r0=0,r1=machine nr,r2=atages 、dtb pointer】

在第一阶段结束时使能mmu, __enable_mmu=>__turn_mmu_on, 跳转到r13存的地

址位置(r13之前加载的是__mmap_switched)=》__mmap_switched=》

start_kernel, 进入第二阶段

内核启动step2:

build_all_zonelists()

setup_log_buf()

trap_init()

mm_init()

sched_init()

init_IRQ()

init_timers()

softirq_init()

time_init()

perf_event_init()

profile_init()

anon_vma_init()

fork_init()

uts_ns_init()

cgroup_init()

acpi_subsystem_init()

arch_call_rest_init()

---rest_init()

------kernel_init, 内核第一线程

----------kernel_init_freeable,这里会等kthreadd创建,等待kthread_done发出才会

执行

-------------workqueue_init=》create_worker=》kthread_create_on_node

("kworker%s")

-------------do_basic_setup=》【driver_init();do_ctors();do_initcalls()】

----------run_init_process,用户空间第一个进程

------kthreadd,内核第二个线程

3. 动态内存分配

rt_system_heap_init(heap_begin, heap_end)

既可以使用空闲的片内空间,也可以使用片外ram

rt_malloc() rt_free()

rt_realloc() 改变原来申请分配的大小,重新分配

rt_calloc(count, size), 从内存堆中分配连续内存地址的多个内存块

4. 线程

RT-Thread的基本单位称线程,我理解对应于Linux的进程概念

线程组成:线程函数,线程控制块(struct rt_thread),线程堆栈

创建线程:

rt_thread_init(struct rt_thread*, name, void(*entry)(), stack_start, stack_size,

prio, tick) == 静态线程

rt_thread_create(name, void(*entry)(),stack_size, prio, tick) == 动态线程

rt_thread_startup()--将线程放到等待队列

Linux创建内核线程也分两个api

第一种方式:kernel_thread()=>_do_fork(), 内核在建立第一个好第二个内核线程是适

用这种方式

第二种方式:建立一个struct kthread_create_info create, 将create挂在

kthread_create_list这个全局链表,kthreadd会再运行时去按照链表一个个建立内核线

程,kthreadd最终还是调用kernel_thread()创建线程

5.线程状态

初始状态=》就绪状态=》运行状态=》挂起状态=》关闭状态

GPIO框架:

rt_pin_mode(pin, mode)

rt_pin_write(rt_base_t pin, value) PIN_HIGH PIN_LOW

rt_pin_read(pin)

rt_thread_delay(tick) rt_thread_mdelay(ms) rt_thread_sleep(tick)

线程栈大小设置:先设置大一点,然后list_thread查看使用率,使用率到底max的

70%~75%比较合适

6.时间调度

RT-Thread支持最大256个优先级, stm32默认支持32个优先级

优先级抢占调度

时间片轮训调度

Linux的调度

RT-Linux的调度

7.空闲线程、钩子函数

rt_thread_idle_sethook(void(*hook)(void)) == 钩子函数不能被挂起,因为idle一直

处于就绪态

rt_thread_idle_delhook(void(*hook)(void))

rt_scheduler_sethook(void(*hook)(sturct rt_thread *from, *to))

8 临界区保护

禁止调度 关中断 信号量 互斥量

禁止调度:

rt_enter_critical()

rt_exit_critical()

关中断

level = rt_hw_interrupt_disable()

rt_hw_interrupt_enable(level)

信号量:

rt_sem_init() rt_sem_detach()

rt_sem_create() rt_sem_delete()

rt_sem_take()/rt_sem_trytake() rt_sem_release

互斥量、互斥锁

rt_mutex_init() rt_mutex_detach()

rt_mutex_create rt_mutex_delete()

rt_mutex_take() rt_mutex_release()

9. 优先级翻转

优先级继承

10.事件集工作机制

用32bit无符号整型,一个bit代表一个事件,

逻辑或---独立型同步

逻辑与---关联型同步

struct rt_event {

struct rt_ips_object parent;

rt_unint32_t set;

}

rt_event_init() rt_event_detach()

rt_event_create() rt_event_delete()

rt_event_send()

rt_event_recv()

11. IPC机制邮箱

struct rt_mailbox

携带4字节内容,一个指针的大小

消息队列

12 定时器

HARD_TIMER 中断上下文

SOFTTIMER 系统timer线程上下文

struct rt_timer{}

13 内存池

内存管理方式

rt_mp_alooc(mp, time)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352