说明
通过上节的 编译下载和运行第一个程序 咱知道咱是在custom里面写自己的程序;
咱后面写自己的程序的时候可以把.c文件放到src文件夹里面; .h文件可以放到inc里面
不过可以随意,我一般喜欢把.c和.h放到一块,这样子方便些,后面我都会把文件放到src文件夹里面
custom_main.c 里面的 int cm_opencpu_entry(void * param) 函数是程序的main函数, 程序从这个函数里面开始执行
现在新建.c和.h文件
因为我不喜欢把.c文件和.h文件分开, 所以我直接把.c和.h文件放到src里面
1,在src文件夹右键选择 新建文件
test.c
2,同样在src文件夹新建个test.h文件
3,然后如果要使用test.c 需要在 SConscript 里面添加包含
代码语言:javascript复制# -*- coding: utf-8 -*-
#====================================================================
#
# Copyright © 2023 China Mobile IOT. All rights reserved.
#
#
#====================================================================
Import('env')
from ModuleBuild import *
module = 'custom_main' # 模块名,同簇模块不得重名
current_dir = os.path.join(Dir('.').abspath)
target = None
#========================================================
# ram_source_files:运行在ram中
# flash_source_files:运行在flash中
#========================================================
ram_source_files = [#添加.c文件路径(让程序运行在ram中)
'custom_main/src/custom_main.c',
'custom_main/src/test.c',
]
flash_source_files = [#添加.c文件路径(让程序运行在flash中,节省内存)
]
#========================================================
# public_incs: 在这个里面添加其它模块里面的.h文件的路径
# private_incs:在这个里面添加本模块(custom_main文件夹)里面的 .h文件的路径
#========================================================
public_incs = [
current_dir '/../examples/mcu_sys/inc',#这边使用mcu_sys.h是其它模块里面的,所以在这里添加路径
]
private_incs = [
current_dir '/custom_main/inc',
current_dir '/custom_main/src',#test.h是本模块里面的,所以在这里添加路径
]
#========================================================
# cpp_define:仅适用于本模块,对其他模块不可见
#========================================================
cpp_defines = [
]
#========================================================
# 模块编译
#========================================================
mod = ModuleBuild(env,
name = module,
ram_srcs = ram_source_files,
flash_srcs = flash_source_files,
pub_incs = public_incs,
pri_incs = private_incs,
cpp_define = cpp_defines
)
target = mod.build_object()
Return('target')
现在说一下咱都可以直接写哪些 #include xxxx.h
1,首先这就是个单片机使用的C编译器,所以C库都是可以的
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
.
.
.
2,然后呢就是厂家内部封装好的库(这些底层都设置好了引用)
咱可以直接在文件里面 #include xxxx.h
3,假设我需要在test里面使用模组的ADC功能, 只需要 #include "cm_adc.h"
4, 然后我就可以使用里的函数了
代码语言:javascript复制#include "cm_adc.h"
void test(void)
{
int32_t adc_value=0;
cm_adc_read(CM_ADC_0, &adc_value);//读取电压
}
5, 除了上面的include里面的,其它地方也有几个直接可以引用的
我只是全方面阐述,知不知道这个无所谓!
标准的思路
1,其实咱们都是在 examples 例子里面找需要的功能,找到自己需要的功能以后看看里面都调用了哪些.h文件咱就调用哪些就可以
2,假设我需要ADC的功能
3,我就可以去掉不必要的之后把需要的拷贝过来
同时我把串口打印改为了使用日志打印(使用日志口打印函数添加 #include "cm_sys.h" 头文件)
代码语言:javascript复制#include "cm_adc.h"
#include <stdint.h>
#include "cm_adc.h"
#include "cm_os.h"
#include "cm_sys.h"
void test(void)
{
int32_t voltage=0;
uint32_t voltage_vbat=0;
int32_t ret;
ret = cm_adc_vbat_read(&voltage_vbat);
if(ret != 0)
{
cm_log_printf(0, "adc vbate read err,ret=%dn", ret);//串口打印改为了使用日志打印
}
cm_log_printf(0, "adc vbate read:%ld(mv)!!n",voltage_vbat);
//测试ADC0
ret = cm_adc_read(CM_ADC_0,&voltage);
if(ret != 0)
{
cm_log_printf(0, "adcCM_ADC_0 read err,ret=0xxn", ret);
}
cm_log_printf(0, "adc CM_ADC_0 read:%ld(mv)!!n",voltage);
cm_log_printf(0, "adc test end!!n");
}
现在我需要在 custom_main.c 里面调用test.c里面的 test函数
1,先按照正常写单片机C语言的规定补全 test.h文件
代码语言:javascript复制#include "test.h"
#include "cm_adc.h"
#include <stdint.h>
#include "cm_adc.h"
#include "cm_os.h"
#include "cm_sys.h"
void test(void)
{
int32_t voltage=0;
uint32_t voltage_vbat=0;
int32_t ret;
ret = cm_adc_vbat_read(&voltage_vbat);
if(ret != 0)
{
cm_log_printf(0, "adc vbate read err,ret=%dn", ret);//串口打印改为了使用日志打印
}
cm_log_printf(0, "adc vbate read:%ld(mv)!!n",voltage_vbat);
//测试ADC0
ret = cm_adc_read(CM_ADC_0,&voltage);
if(ret != 0)
{
cm_log_printf(0, "adcCM_ADC_0 read err,ret=0xxn", ret);
}
cm_log_printf(0, "adc CM_ADC_0 read:%ld(mv)!!n",voltage);
cm_log_printf(0, "adc test end!!n");
}
代码语言:javascript复制#ifndef test_h_
#define test_h_
void test(void);
#endif
2,然后就可以调用了
代码语言:javascript复制#include "custom_main.h"
#include "test.h"
int cm_opencpu_entry(void *param)
{
(void)param;
test();
return 0;
}