RTT startup.c 代码学习

RTT的学习集中在应用层,底层的代码会在必要的时候涉及一下。

 

startup是RTT的启动代码,类似于ucos。

 

void rtthread_startup(void)
{
    /* init board */
    rt_hw_board_init();

    /* show version */
    rt_show_version();

    /* init tick */
    rt_system_tick_init();

    /* init kernel object */
    rt_system_object_init();

    /* init timer system */
    rt_system_timer_init();

    /* init scheduler system */
    rt_system_scheduler_init();

    /* init all device */
    rt_device_init_all();

    /* init application */
    rt_application_init();

    /* init idle thread */
    rt_thread_idle_init();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return ;
}


 

看了一下,rt_hw_board_init(); 和 rt_application_init(); 是我需要关注的代码。

第一个为板级的初始化,第二个是各个线程的初始化。

 -----------------------------------------------------------------------------------------------------------------------------------

#ifdef RT_USING_HEAP
#if STM32_EXT_SRAM
    rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END);
#else
#ifdef __CC_ARM
    rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END);
#elif __ICCARM__
    rt_system_heap_init(__segment_end("HEAP"), (void*)STM32_SRAM_END);
#else
    /* init memory system */
    rt_system_heap_init((void*)&__bss_end, (void*)STM32_SRAM_END);
#endif
#endif
#endif


 

这段代码是有关运行时堆的初始化。分别对应外部RAM,MDK, IAR, GCC。那个MDK奇奇怪怪的写法在另一篇博文中有叙述了,简单来说就是用没有初始化的RAM作为起始一直到结束。堆的话主要是动态线程的创建,内存分配要用。静态线程什么的其栈已知,故初始化RAM有。那个奇奇怪怪的符号是链接器特有的,用来获知已用RAM的结尾地址。

 

转载于:https://www.cnblogs.com/lyyyuna/archive/2013/02/04/4123955.html

### STM32 使用 SEGGER RTT 配置方法及示例代码 #### 1. 安装和配置工具链 为了使用SEGGER RTT功能,在开发环境中需要安装并配置好必要的工具链和支持库。确保已经安装了SEGGER Embedded Studio (SES),并且通过STM32CubeMX生成了一个基于STM32的项目模板。 #### 2. 启用RTT支持 在STM32CubeMX中创建新项目时,可以在“Pinout & Configuration”标签页下的“Connectivity”部分找到并启用`USARTx`接口作为调试端口[^1]。接着进入“Configuration -> Middleware”,勾选`Segger Rtt`选项来激活中间件的支持。 #### 3. 修改启动文件 编辑由STM32CubeMX自动生成的startup_stm32xxxx.s汇编源码文件(具体取决于所使用的MCU型号),添加如下指令以初始化SystemView跟踪: ```assembly .import __SEMIHOSTING_INIT .section .semihosting, "a" __SEMIHOSTING_INIT: BL _init_semihosting ``` 此操作并非严格必要但对于某些应用场景可能有所帮助。 #### 4. 编写应用程序代码 接下来编写简单的测试程序验证RTT通信是否正常工作。下面是一个完整的C语言实现例子,它会周期性地向PC发送字符串消息并通过终端显示出来: ```c #include "main.h" #include "segger_rtt.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { /* 发送数据到上位机 */ SEGGER_RTT_WriteString(0, "Hello from STM32 via RTT!\r\n"); HAL_Delay(1000); // 延迟一秒 } } ``` 上述代码片段展示了如何利用SEGGER RTT API函数将字符流传输至上位计算机,并且每秒钟重复一次该过程[^2]。 #### 5. 运行与调试 完成以上步骤之后就可以构建并下载固件至目标板卡上了。连接USB线缆后打开J-Link控制台或其他兼容IDE中的RTT视图窗口即可查看来自嵌入式系统的实时日志输出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值