RT-Thread Studio---oled显示屏在main中使用与线程创建

前言

前面记录了 ART-PI点亮OLED显示屏,我就发现,只能通过shell命令点亮OLED显示屏,那么如果说让OLED显示屏像创建一个线程那样,就会涉及到很多问题。这里我使用的开发工具是studio。

1.重新创建display.cpp文件

为什么要创建Cpp文件呢,基于OLED软件包,我发现软件包的以下代码在.c文件是识别不出来的,会报错,具体为什么还不清楚。

static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,\
                                         /* clock=*/ OLED_I2C_PIN_SCL,\
                                         /* data=*/ OLED_I2C_PIN_SDA,\
                                         /* reset=*/ U8X8_PIN_NONE);
                                         // All Boards without Reset of the Display

为什么要重新创建cpp文件呢,也是因为要重新写一个函数,看软件包中实例代码,需要传两个参数,参数具体是什么不清楚,但是如果想调用的话还需要传参,太麻烦!直接重新改。

static void u8g2_ssd1306_12864_sw_i2c_example(int argc,char * argv[])

在applications中使用创建display.cpp文件,将软件包sample代码复制过来,修改得到如下:

#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <U8g2lib.h>



/*#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <U8g2lib.h>
#include <stdio.h>
#include <drv_soft_i2c.h>*/
#include "drv_common.h"

// You may reference Drivers/drv_gpio.c for pinout
// In u8x8.h #define U8X8_USE_PINS
#define OLED_I2C_PIN_SCL                    GET_PIN(H, 11)
#define OLED_I2C_PIN_SDA                    GET_PIN(H, 12)

// Check https://github.com/olikraus/u8g2/wiki/u8g2setupcpp for all supported devices
static U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,\
                                         /* clock=*/ OLED_I2C_PIN_SCL,\
                                         /* data=*/ OLED_I2C_PIN_SDA,\
                                         /* reset=*/ U8X8_PIN_NONE);
                                         // All Boards without Reset of the Display

 void oled_display()
{

      while(1){
           rt_kprintf("123");
          u8g2.begin();

            u8g2.clearBuffer();                         // clear the internal memory
            u8g2.setFont(u8g2_font_6x13_tr);            // choose a suitable font
            u8g2.drawStr(0, 18, "Welcome2018!");   // write something to the internal memory
            u8g2.sendBuffer();                          // transfer internal memory to the display
            u8g2.setFont(u8g2_font_unifont_t_symbols);
            u8g2.drawGlyph(112, 56, 0x2603 );
            u8g2.sendBuffer();
            rt_thread_mdelay(500);
            u8g2.clearBuffer();                         // clear the internal memory
                        u8g2.setFont(u8g2_font_6x13_tr);            // choose a suitable font
                        u8g2.drawStr(0, 18, "Welcome2019!");   // write something to the internal memory
                        u8g2.sendBuffer();                          // transfer internal memory to the display
                        u8g2.setFont(u8g2_font_unifont_t_symbols);
                        u8g2.drawGlyph(112, 56, 0x2603 );
                        u8g2.sendBuffer();

                        rt_thread_mdelay(500);
      }

}

后来发现,这个函数在软件包的示例代码里面写也是没问题的!
那么问题来了,在main.c中调用cpp文件中的函数是行不通的,会报错。

2.解决.c中调用.cpp中函数的方法

在.cpp中需要调用的函数前面加上extern “C” 即可,在.c中调用这个方法也不需要包含头文件,直接调用,干就完了,第一次编译会有一个warning(隐式声明),第二次就不会报错了。
实例:

在.cpp
extern "C"  void oled_display(){
 ......................
}
在其他.c文件中直接调用
oled_display();

3. 创建OLED线程

在applactions中创建oled.c和oled.h文件,代码如下:
oled.h文件

#ifndef APPLICATIONS_OLED_H_
#define APPLICATIONS_OLED_H_
static void thread2_entry(void *param);
int thread_sample(void);
#endif /* APPLICATIONS_OLED_H_ */

oled.c文件

#include <rtthread.h>
#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5



ALIGN(RT_ALIGN_SIZE)
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程 2 入口 */
static void thread2_entry(void *param)
{
    oled_display();
}
int thread_oled(void)
{
    /* 初始化线程 2,名称是 thread2,入口是 thread2_entry */
    rt_thread_init(&thread2,
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
    rt_thread_startup(&thread2);//启动线程

    return 0;
}

在main.c中启动oled线程函数

#include "
void mian(){
		thread_oled(void);
}
 

注:需要在构建配置里面设置包含的头文件路径!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread Studio是一款基于Eclipse的RT-Thread开发环境,它提供了一整套的开发工具,包括代码编辑器、编译器、调试器等,用于开发实时操作系统(RTOS)上的嵌入式软件。使用RT-Thread Studio,开发者可以更高效地进行实时系统的开发和调试。以下是关于RT-Thread Studio使用的一些主要特点和介绍: 1. 集成开发环境(IDE):RT-Thread Studio提供了直观的图形界面,使开发者能够轻松地创建、编辑、编译和调试RT-Thread应用程序。 2. 代码编辑器:RT-Thread Studio的代码编辑器支持多种语言,包括C/C++,开发者可以在其编写和编辑代码。 3. 编译器:RT-Thread Studio集成了RT-Thread的编译器,可以将编写好的代码编译成可在嵌入式设备上运行的二进制文件。 4. 调试器:RT-Thread Studio提供了强大的调试工具,允许开发者在嵌入式设备上实时观察和修改代码的运行状态,以便进行调试和优化。 5. 集成工具链:RT-Thread Studio集成了RT-Thread的开发工具链,包括交叉编译工具、下载工具、性能分析工具等,方便开发者进行整个开发流程。 6. 代码版本管理:RT-Thread Studio支持代码版本管理,如Git,方便团队进行协作开发和版本控制。 7. 实时更新和文档:RT-Thread Studio提供了实时更新的RT-Thread版本和相关文档,方便开发者获取最新的功能和信息。 8. 集成仿真器:RT-Thread Studio支持多种仿真器,如QEMU、STM32CubeMX等,方便开发者在开发过程进行模拟和调试。 使用RT-Thread Studio进行实时系统开发的一般步骤如下: 1. 安装和配置RT-Thread Studio:根据官方文档或教程,安装并配置RT-Thread Studio环境。 2. 创建新项目:使用RT-Thread Studio创建新的实时系统项目。 3. 编写代码:在代码编辑器编写C/C++代码,实现所需的功能。 4. 编译代码:使用RT-Thread编译器将代码编译成可在嵌入式设备上运行的二进制文件。 5. 下载和部署:使用RT-Thread Studio提供的下载工具将二进制文件部署到嵌入式设备上。 6. 调试和优化:使用RT-Thread Studio的调试工具进行实时调试和性能优化。 7. 测试和发布:对部署到嵌入式设备上的软件进行测试,确保功能正常,然后进行发布。 总的来说,使用RT-Thread Studio进行实时系统开发可以提高开发效率,简化开发流程,并有助于提高软件的质量和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜大大的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值