精华内容
下载资源
问答
  • @GetMapping("/test001") public String test001() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } return "test001"; }
  • rtthread

    2020-10-20 11:55:15
    rt_inline void rt_list_init(rt_list_t *l) { l->next = l->prev = l; } 插入 rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n) { l->next->prev = n; n->next = l->next; ...

    链表

    初始化双向链表

    rt_inline void rt_list_init(rt_list_t *l)
    {
        l->next = l->prev = l;
    }
    

    插入

    rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n)
    {
        l->next->prev = n;
        n->next = l->next;
    
        l->next = n;
        n->prev = l;
    }
    

    在这里插入图片描述
    NODE1后面插入节点n,可以理解为:NODE3的前一个结点为n,n的后一个节点为NODE3,NODE3l->next

    删除

    rt_inline void rt_list_remove(rt_list_t *n)
    {
        n->next->prev = n->prev;
        n->prev->next = n->next;
    
        n->next = n->prev = n;
    }
    

    在这里插入图片描述

    就绪列表

    就是一个rt_list_t类型的数组。

    /* 线程就绪列表 */
    rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];
    

    每个线程控制块都有一个成员tlist,类型为rt_list_t.我们将线程插入到就绪列表里面,就是通过将线程控制块的 tlist 这个节点插入到就绪列表中来实现的。

    /* 初始化线程 */
    rt_thread_init( &rt_flag1_thread,                 /* 线程控制块 */
                    flag1_thread_entry,               /* 线程入口地址 */
                    RT_NULL,                          /* 线程形参 */
                    &rt_flag1_thread_stack[0],        /* 线程栈起始地址 */
                    sizeof(rt_flag1_thread_stack) );  /* 线程栈大小,单位为字节 */
    /* 将线程插入到就绪列表 */
    rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );
    

    系统调度初始化

    /**
     * @ingroup SystemInit
     * This function will initialize the system scheduler
     */
    void rt_system_scheduler_init(void)
    {
        register rt_base_t offset;
    	/* 线程就绪列表初始化 */
        for (offset = 0; offset < RT_THREAD_PRIORITY_MAX; offset ++)
        {
            rt_list_init(&rt_thread_priority_table[offset]);
        }
    	/* 初始化当前线程控制块指针 */
        rt_current_thread = RT_NULL;
    }
    

    此时的链表为空
    在这里插入图片描述

    启动调度器

    /**
     * @ingroup SystemInit
     * This function will startup scheduler. It will select one thread
     * with the highest priority level, then switch to it.
     */
    void rt_system_scheduler_start(void)
    {
        register struct rt_thread *to_thread;
        register rt_ubase_t highest_ready_priority;
    
    #if RT_THREAD_PRIORITY_MAX > 32
        register rt_ubase_t number;
    
        number = __rt_ffs(rt_thread_ready_priority_group) - 1;
        highest_ready_priority = (number << 3) + __rt_ffs(rt_thread_ready_table[number]) - 1;
    #else
        highest_ready_priority = __rt_ffs(rt_thread_ready_priority_group) - 1;
    #endif
    
        /* get switch to thread */
        to_thread = rt_list_entry(rt_thread_priority_table[highest_ready_priority].next,
                                  struct rt_thread,
                                  tlist);
    
        rt_current_thread = to_thread;
    
        /* switch to new thread */
        rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
    
        /* never come back */
    }
    

    临界段保护

    PRIMASK寄存器

    这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0

    ;/*
    ; * rt_base_t rt_hw_interrupt_disable();
    ; */
    rt_hw_interrupt_disable    PROC
        EXPORT  rt_hw_interrupt_disable
        MRS     r0, PRIMASK
        CPSID   I
        BX      LR
        ENDP
    
    ;/*
    ; * void rt_hw_interrupt_enable(rt_base_t level);
    ; */
    rt_hw_interrupt_enable    PROC
        EXPORT  rt_hw_interrupt_enable
        MSR     PRIMASK, r0
        BX      LR
        ENDP
    

    为什么不直接这样写?

    ;/*
    ; * void rt_hw_interrupt_disable();
    ; */
    rt_hw_interrupt_disable PROC
    EXPORT rt_hw_interrupt_disable
    CPSID I
    BX LR
    ENDP
    
    ;/*
    ; * void rt_hw_interrupt_enable(void);
    ; */
    rt_hw_interrupt_enable PROC
    EXPORT rt_hw_interrupt_enable
    CPSIE I
    BX LR
    ENDP
    

    避免在嵌套的临界段失效,如下所示

    /* 临界段代码 */
    {
    	/* 临界段 1 开始 */
    	rt_hw_interrupt_disable(); /* 关中断,PRIMASK = 1 */
    	{
    		/* 临界段 2 */
    		rt_hw_interrupt_disable(); /* 关中断,PRIMASK = 1 */
    		{
    		
    		}
    		rt_hw_interrupt_enable(); /* 开中断,PRIMASK = 0 */ //(注意)
    	}
    	/* 这里已经开启了中断,而临界段1还未结束 */
    	/* 临界段 1 结束 */
    	rt_hw_interrupt_enable(); /* 开中断,PRIMASK = 0 */
    }
    

    正确做法如下:

    PRIMASK = 0; /* PRIMASK 初始值为 0,表示没有关中断 */ 
    rt_base_t level1;
    rt_base_t level2;
    
    /* 临界段代码 */
    {
    	/* 临界段 1 开始 */
    	level1 = rt_hw_interrupt_disable(); /* 关中断,level1=0,PRIMASK=1 */
    	{
    		/* 临界段 2 */
    		level2 = rt_hw_interrupt_disable(); /* 关中断,level2=1,PRIMASK=1 */ 
    		{
    		
    		}
    		rt_hw_interrupt_enable(level2); /* 开中断,level2=1,PRIMASK=1 */
    	}
    	/* 临界段 1 结束 */
    	rt_hw_interrupt_enable(level1); /* 开中断,level1=0,PRIMASK=0 */ 
    }
    

    对象

    软件定时器

    
    
    
    
    
    
    展开全文
  • RT3052 SOC结合了MediaTek(Ralink)的802.11n草案,兼容2T2R MAC/BBP/RF、高性能的384MHz MIPS24KEc CPU内核、5端口集成10/100以太网交换机/PHY、USB OTG和GIG。比特以太网MAC使用RT3052的2.4GHz11n无线产品所需的...

    RT3052 SOC结合了MediaTek(Ralink)的802.11n草案,兼容2T2R MAC/BBP/RF、高性能的384MHz MIPS24KEc CPU内核、5端口集成10/100以太网交换机/PHY、USB OTG和GIG。比特以太网MAC使用RT3052的2.4GHz11n无线产品所需的外部组件很少。它使用MediaTek的第二代11n技术来实现更长的范围和更好的吞吐量。嵌入式高性能cpu可以毫不费力地处理高级应用程序,例如路由、安全和VOIP。USB端口可以配置为访问数字家庭应用程序的外部存储。RT3052还具有丰富的硬件接口(SPI/I2S/I2C/UART/GMAC),以支持许多可能的应用程序。

     

    RT3883 SOC结合了MediaTek(Ralink)的802.11n草案兼容3T3R MAC/BBP/RF、高性能的500MHz MIPS74Kec CPU核、千兆位以太网MAC和USB主机/设备。使用RT3883,2.4/5GHz11n无线产品所需的外部组件很少。RT3883采用MediaTek第二代11n技术实现更长的范围和更好的吞吐量。嵌入式HIGH性能CPU可以轻松地处理高级应用程序,例如WIFI数据处理,而不会使主机处理器过载。此外,RT3883拥有丰富的硬件接口

    (SPI/I2S/I2C/PCM/UART/USB/PCI/PCIe/RGMII/MII),以支持许多可能的应用程序。

     

    RT3352 SOC结合MediaTek(Ralink)的802.11n草案,兼容2T2R MAC/BBP/PA/RF,高性能400MHz MIPS24KEc CPU核心,千兆位以太网MAC,5 Pors集成10/100以太网Swtich/PHY和USB主机/设备。对于RT3352,2.4GHz11n无线产品所需的外部组件非常少。RT3352采用MediaTek第二代11n技术用于Longer范围和更好的吞吐量。嵌入式高性能CPU可以轻松地处理诸如WiFi数据处理等高级应用程序,而不需要重载主机处理器。此外,RT3352具有丰富的硬件接口(SPI/I2S/I2C/PCM/UART/USB/GMAC),可以实现许多可能的应用程序。

     

    RT5350 SOC结合MediaTek(Ralink)的802.11n草案兼容1T1R MAC/BBP/PA/RF、高性能360 MHz MIPS24KEc CPU核心、5端口集成10/100以太网Swtich/PHY和USB主机/设备。使用RT5350,2.4GHz11n无线产品所需的外部组件非常少。RT5350采用MediaTek第二代11n技术实现更长的范围和更好的吞吐量。嵌入式高性能CPU可以轻松地处理诸如WiFi数据处理等高级应用程序,而不需要重载主机处理器。此外,RT 5350具有丰富的硬件接口(SPI/I2S/I2C/PCM/UART/USB),以支持许多可能的应用程序。

     

    RT2880 SOC结合MediaTek(Ralink)的802.11n草案兼容2T3R MAC/BBP、高性能266MHz MIPS4KEc CPU内核、千兆以太网MAC和pci主机/设备。以支持多种高性能、低成本的802.11n应用程序。RT2880有两个RF配套芯片:用于2.4G频段操作的RT2820;用于双波段2.4G或5G操作的RT2850。此外对于传统的AP/路由器应用,芯片组可以实现为WLAN“智能”网卡,大大减少了主机SOC的负载,如DSL/电缆或多媒体应用处理器。用户可以将无线局域网视为一个简单的以太网设备,可以方便地移植和保证802.11n无线局域网的性能,而不需要升级到昂贵的主机SOC。

    展开全文
  • RT-Thread | RT-Thread Studio初体验

    千次阅读 2020-01-03 20:28:11
    RT-Thread Studio简介 最近,RT-Thread Studio是RT-Thread最近发布的一款IDE,现在我们来使用一下。 首先,软件界面配色效果很棒,看起来很舒服。欢迎界面如下: 可以看到欢迎界面包含有很多有用的信息:最新动态、...

    1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

    RT-Thread Studio简介

    最近,RT-Thread StudioRT-Thread最近发布的一款IDE,现在我们来使用一下。

    首先,软件界面配色效果很棒,看起来很舒服。欢迎界面如下:
    ======001

    可以看到欢迎界面包含有很多有用的信息:最新动态、软件试用视频教程、最新PR等。RT-Thread Studio是基于eclipse平台开发, 界面设计和风格继承自eclipse。如:

    ======002

    因为基于eclipse平台开发的IDE都很相似,比如TICCSCode Composer Studio)软件:

    ======003

    可以发现,RT-Thread StudioCCS的很相似,比较大的区别就是CCS是英文的,RT-Thread Studio是中文的。不愧是国产操作系统,开发出来的IDE是中文的(估计以后应该也会出英文版),可以很好地照顾到像我这样的英文不好的开发者。

    RT-Thread Studio使用

    我们来试用一下RT-Thread Studio,创建一个RT-Thread工程。首先,新建工程:

    ======004
    ======005
    ======006

    可以选择建立基于BSP的工程,也可以建立基于芯片的工程。这里我们选择创建基于潘多拉IOT开发板BSP工程:

    ======007
    ======008

    可以看到工程下有一个RT-Thread Settings文件, 通过这个可以进行图形化地对RT-Thread进行配置,双击RT-Thread Settings文件可进入配置界面,配置界面如下:

    ======009

    可见,通过这个配置界面可以很方便地对内核、组件、软件包及硬件进行配置。配置完成之后按下ctrl+s即可保存配置。使用RT-Thread Studio来编辑代码也是很舒服的,自动补全杠杠的,输入1个字符就有相关提示:

    ======010

    下面我们进行编译:
    ======011
    ======012

    ======013

    下载、运行程序:
    ======014
    ======019
    ======020

    启动调试:
    ======015
    ======016
    ======017
    ======018

    最后,我最喜欢RT-Thread Studio很有特色的一点就是集成了 MarkDown 编辑器:

    ======021

    有了这个,我们就可以把REDEME文件写得很清楚很详细了,比如可以插入图片等,不像用keil的时候只能写点文本记录一下。

    总结

    RT-Thread Studio这个IDE很强大很易用,在使用RT-Thread的时候就不用像之前一样一步一步移植,有了这个软件就可以快速建立包含有RT-Thread的工程。

    除此之外,尽管是裸机开发,也可以很快速的建立工程,甚至可以替换掉keil,虽然现在支持的MCU只有STM32的,但是相信之后肯定会慢慢更新得越来越完善,我们一起来期待。还没用的朋友赶快用起来吧,真的很香!

    关于RT-Thread Studio的细节可查阅其帮助手册。

    技术交流QQ群:696658660

    展开全文
  • RT-thread中实现rt_kprintf

    2020-10-21 20:12:40
    rt_kprintf的作用 可以在代码中使用 RT-Thread 提供的打印函数 rt_kprintf() 进行信息打印,从而获取自定义的打印信息,方便定位代码 bug 或者获取系统当前运行状态等。 比如在初始化的时候系统会通过rt_kprintf打印...

    rt_kprintf的作用

    可以在代码中使用 RT-Thread 提供的打印函数 rt_kprintf() 进行信息打印,从而获取自定义的打印信息,方便定位代码 bug 或者获取系统当前运行状态等。

    比如在初始化的时候系统会通过rt_kprintf打印当前操作系统的版本信息

    void rt_show_version(void)
    {
        rt_kprintf("\n \\ | /\n");
        rt_kprintf("- RT -     Thread Operating System\n");
        rt_kprintf(" / | \\     %d.%d.%d build %s\n",
                   RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__);
        rt_kprintf(" 2006 - 2019 Copyright by rt-thread team\n");
    }
    

    实现rt_kprintf需要哪几步

    需要实现一个发送字符串的函数,函数名必须是rt_hw_console_output,不能是其他的。rt_hw_console_output可以写在任意一个.c文件中。比如usart.c 或者 main.c

    开始需要进入临界段,因为打印的时候希望一次性打完,而不是分批打印。进入临界段CPU的控制权就不会被剥夺。

    在\n之前需要加上\r,这是官方网站中有所提示注意的。

    image-20201021200308996

    void rt_hw_console_output(const char *str)
    {
      rt_enter_critical(); //进入零阶段
    	while(*str != 0)
    	{
    		if(*str == '\n')
    		{
    			USART1_PutChar('\r');	
    		}
    		USART1_PutChar(*str++);
    	}
    	rt_exit_critical();
    }
    

    为什么这个函数写在哪个.c文件都能被找到

    实际中发现无论这个函数放在哪个.c文件中,最后都能被发现且成功执行。有大佬回答了这个问题,可以移步这儿查看

    在linux的驱动代码中经常可以看到__weak去修饰一个函数或者变量,大多是用来修饰函数。

    它的作用有两个:

    1.weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数, 那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

    2.__weak 在回调函数的时候经常用到。这样的好处是,**系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,**使用非常方便

    展开全文
  • RT-Thread——国产RTOS标杆

    万次阅读 多人点赞 2018-04-19 23:50:56
    大概是2014年9月,接过主管交接的项目,项目以STM32F103ZET6硬件平台,而运行的实时系统(RTOS)正是RT-Thread(RTT)。也是从此时开始接触到RTT,国人自己写的开源系统,从此对其也是“爱不释手”,在往后的工作中...
  • rt.jar

    热门讨论 2012-09-20 13:24:11
    rt.jar
  • RT Thread 文件系统教程RT Thred 文件系统教程-1 SPI Flash使用文件系统小技巧打开RT-Thread Studio软件,新建工程W25Q128底层编写在spi1总线上挂载W25Q128块设备。挂载文件系统到根目录,代码如下测试如下 RT Thred...
  • RTthread 定时器

    2020-05-17 21:38:01
    struct rt_timer { struct rt_object parent; /**< inherit from rt_object */ rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL]; // 定时器列表节点 void (*timeout_func)(void *parameter); /**< timeout ...
  • rt_system_scheduler_start 与rt_schedule的区别 rt_system_scheduler_start:用于启动RT-Thread内核调度器,该函数是不会返回的,在该函数调用之前创建的线程是不会被调度的。 rt_schedule: 触发内核调度操作...
  • rt_thread_sleep函数做了两部:1.把调用者线程挂起;2.调用一次线程调度 /** * This function will let current thread sleep for some ticks. * * @param tick the sleep ticks * * @return RT_EOK */ rt_...
  • RT-Thread

    2019-11-06 17:42:54
    https://www.rt-thread.org/index.html https://github.com/RT-Thread/rt-thread.git
  • i.MX RT1052是i.MX RT系列芯片,是由 NXP 半导体公司推出的跨界处理器芯片,该系列下又包括i.MX RT1020、i.MX RT1050及 i.MX RT1060等子系列芯片。所谓“跨界”,是指它自身的定位既非传统的应用处理器也非传统的微...
  • 原文:http://wiki.debian.org/rt2870sta#Lenny<br />  目录Ralink RT2070, RT2770, RT2870, RT3070, RT3071, RT3072 devicesInstallationSqueezeLennyTroubleshootingSupported DevicesSee ...
  • 本文介绍了如何在 RT-Thread Studio 上使用 RT-Thread Nano,并以创建 stm32f103RB 的 Nano 工程为例。准备工作安装 RT-Thread St...
  • 去年,RT-Thread发布了RT-Thread Studio初版《RT-Thread Studio的使用体验:真香!...
  • 使用rt-thread的同学可能会发现,RT官方预留的打印功能rt_kprintf无法输出小数,不知道是不是全部版本都这样,我这里使用的是3.1.4的版本出现这种情况,使用MCU为stm32 即使用类似下方打印输出时 float num = ...
  • RT-Thread—重映射串口到rt_kprintf

    千次阅读 2019-11-17 15:07:37
    文章目录重映射rt_kprintf()函数定义自定义rt_hw_console_output() 重映射 在初学C语言时,用的最多的怕是printf()函数了,其作用就是将传入的参数打印到屏幕上,可以实现人机交互或方便用户对程序的调试等等。 在RT...
  • In terms of user use, Xiong Puxiang demonstrated RT-Thread Smart's complete graphical user interface on the spot, including a graphical user system that supports interface dragging layout space, multi...
  • RT1052 rtthread 报错"FPU active!" “UNALIGNED” 问题 RT1052 rtthread 报错"FPU active!" “UNALIGNED” 开发环境 RT-Thread: v4.0.2(master) SOC: i.MX RT1050 Board: 野火 RT1052 问题背景 我创建了一个线程去...
  • RT-Thread Studio 安装 一、下载RT-Thread Studio 访问RT-Thread官网即可下载RT-Thread Studio安装包。 选择【资源】->【RT-Thread Studio】 点击【RT-Thread Studio下载】 即可到达下载页面...
  • 一、RT-Thread简介 RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统, 基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。 二...
  • 文章目录一、RT-Thread 操作系统简介二、RT-Thread Studio1. 下载2. 创建工程3. 测试 一、RT-Thread 操作系统简介 略 二、RT-Thread Studio 虽然 RT-Thread(简称RTT)只是一个操作系统,理论上是可以任何一个IDE 如...
  • RT-Thread中使用线程这个概念,而不是任务。两者相似,我在这里把他的线程当作任务来理解了 1、任务处理: 动态任务相关API 创建任务:rt_thread_create函数,创建任务之后会返回rt_thread_t类型的任务ID 创建之后...
  • 编译RT5572 RT3572

    千次阅读 2013-08-28 13:26:25
    scripts/Makefile.build:49: *** CFLAGS was changed in "/opt/DPO_RT5572_LinuxSTA_2.6.1.3_20121022/os/linux/Makefile". Fix it to use EXTRA_CFLAGS. Stop. 解决方式:make KBUILD_NOPEDANTIC=1 Ther
  • RT-Thread学习笔记——移植RT-Thread到STM32

    万次阅读 多人点赞 2019-01-22 11:08:27
    从本文开始,记录自己的RT-Thread学习笔记,基于STM32L475VET6讲解,相关开发板用RTT&amp;正点原子的潘多拉IoT Board开发板。本文先从Nano开始学起,个人觉得对于初学者,还是先学会Nano的移植,把内核部分向学...
  • RTPREEMPT rt实时补丁

    千次阅读 2013-05-15 20:49:45
    RT PREEMPT HOWTO Intro Authors Luotao Fu (l.fu AT pengutronix DOT de), Pengutronix e.K., Kernel Development Group  Robert Schwebel (r.schwebel AT pengutronix DOT de), Pengutronix e.K., ...
  • RT-Thread是一个功能强大,组件丰富的物联网操作系统。 物联网操作系统是指以操作系统内核(可以是RTOS、Linux等)为基础,包括文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接...
  • 最近做实验的时候发现RT-Thread无法正常输出浮点数,在调试的时候发现计算结果正确,但是输出数字却对不上,具体表现为不支持 %f,问题出现在rt_kprintf()和ulog日志输出。 查阅资料过后目前解决方法如下: rt_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,064
精华内容 23,625
关键字:

rt