使用FOUNDATION_EXPORT或者#define来定义常量

本文介绍了在iOS开发中定义常量的两种常见方法:使用宏定义和通过声明常量变量来实现。这两种方法各有特点,适用于不同的场景。

一般iOS我们定义常量的方法有两种:

1.

#define kMyConstantString @"Hello"

2.

.h文件

FOUNDATION_EXPORT NSString * const kMyConstantString;  
FOUNDATION_EXPORT NSString * const kMyConstantString2;

.m文件

NSString * const kMyConstantString = @"Hello";
NSString * const kMyConstantString2 = @"World";
/* * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2022. All rights reserved. * Description: adm706_wdt.c * Author: BSP * Create: 2022/09/30 */ /* * drivers/watchdog/adm706_wdt.c * * WDT driver for adm706 * Copyright (C) 2010, Huawei Corporation. * * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307 USA. * */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/device.h> #include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/uaccess.h> #include <linux/of.h> #include <linux/of_device.h> #include <linux/gpio.h> #include <linux/delay.h> #include <linux/timer.h> #include <linux/of_gpio.h> #include <linux/types.h> static int nowayout = WATCHDOG_NOWAYOUT; static unsigned long wdt_status; static long boot_status; int wdt_reboot_time = 6000; /* 内核停止喂狗倒计时10分钟 */ int wdt__min_reboot_time = 600; /* 内核至少喂狗600*100ms:60秒 */ int wdt_timer_stop = 0; int disable_wdt_file = 0; /* 0表示记文件,1表示不记文件 */ #define WDT_IN_USE 0 #define WDT_OK_TO_CLOSE 1 #define WDT_ENABLED 2 #define WDT_REBOOT_TIME 50 /* 上层接管后50*100ms不喂狗系统则重启 */ #define WDT_HIGH_LEVEL 1 #define WDT_LOW_LEVEL 0 /* 喂狗寄存器 */ static uintptr_t g_wtd_reg_base_addr_mapped; void set_wdt_reg_val(unsigned int val) { if (g_wtd_reg_base_addr_mapped) { writel(val, (volatile void __iomem *)g_wtd_reg_base_addr_mapped); } } static long adm706_watchdog_timeout(void) { return (1600); // 1600 超时时间 } static void wdt_enable(void) { set_wdt_reg_val(WDT_HIGH_LEVEL); msleep(10); // 时间缓冲10ms set_wdt_reg_val(WDT_LOW_LEVEL); } /* returns 0 if the timer was successfully disabled */ static int wdt_disable(void) { printk(KERN_INFO "WATCHDOG: can't be Disabled by software\n"); return 0; } static int adm706_wdt_open(struct inode *inode, struct file *file) { if (test_and_set_bit(WDT_IN_USE, &wdt_status)) return -EBUSY; clear_bit(WDT_OK_TO_CLOSE, &wdt_status); wdt_enable(); set_bit(WDT_ENABLED, &wdt_status); return nonseekable_open(inode, file); } static ssize_t adm706_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) { if (len) { if (!nowayout) { size_t i; clear_bit(WDT_OK_TO_CLOSE, &wdt_status); for (i = 0; i != len; i++) { char c; if (get_user(c, data + i)) return -EFAULT; if (c == 'V') set_bit(WDT_OK_TO_CLOSE, &wdt_status); } } wdt_reboot_time = WDT_REBOOT_TIME; } return len; } static const struct watchdog_info ident = { .options = WDIOF_CARDRESET | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING, .identity = "adm706 watchdog", }; static long adm706_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int options; int ret = -ENOTTY; int __user *argp = (int __user *)compat_ptr(arg); switch (cmd) { case WDIOC_GETSUPPORT: if (copy_to_user(argp, &ident, sizeof ident)) { ret = -EFAULT; } else { ret = 0; } break; case WDIOC_GETSTATUS: ret = put_user(0, argp); break; case WDIOC_GETBOOTSTATUS: ret = put_user(boot_status, argp); break; case WDIOC_SETOPTIONS: options = (int) arg; if ((unsigned int)options & WDIOS_DISABLECARD) { if (!nowayout) { if (wdt_disable() == 0) { set_bit(WDT_OK_TO_CLOSE, &wdt_status); ret = 0; } else { ret = -ENXIO; } } else { ret = 0; } } if ((unsigned int)options & WDIOS_ENABLECARD) { wdt_enable(); ret = 0; } break; case WDIOC_KEEPALIVE: wdt_enable(); ret = 0; break; case WDIOC_SETTIMEOUT: ret = _IOC_SIZE(cmd); break; case WDIOC_GETTIMEOUT: ret = put_user(adm706_watchdog_timeout(), argp); break; default: break; } return ret; } static int adm706_wdt_release(struct inode *inode, struct file *file) { int state = 1; if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { if (test_bit(WDT_ENABLED, &wdt_status)) { state = wdt_disable(); } } /* if the timer is not disbaled reload and notify that we are still * going down */ if (state != 0) { wdt_enable(); } clear_bit(WDT_IN_USE, &wdt_status); clear_bit(WDT_OK_TO_CLOSE, &wdt_status); printk(KERN_INFO "watchdog released, system is going to reboot ...\n"); return 0; } static const struct file_operations adm706_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = adm706_wdt_write, .unlocked_ioctl = adm706_wdt_ioctl, .open = adm706_wdt_open, .release = adm706_wdt_release, }; static struct miscdevice adm706_wdt_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", .fops = &adm706_wdt_fops, }; struct task_struct *p_creat_file; static void kick_wdt_fn(struct timer_list *timer) { static unsigned int count = 0; set_wdt_reg_val(count & WDT_HIGH_LEVEL); count++; mod_timer(timer, jiffies + msecs_to_jiffies(100)); // 100 定时器每次递加时间为100s } DEFINE_TIMER(kick_wdt_timer, kick_wdt_fn); /* 内核中通用喂狗函数,可以放置在内核任何需要喂狗的地方 */ void adm706_wdt_common(void) { static int val = 0; val = (val ? WDT_LOW_LEVEL : WDT_HIGH_LEVEL); if (wdt_timer_stop == 0) { set_wdt_reg_val(val); } } EXPORT_SYMBOL(adm706_wdt_common); static void adm706_wdt_init(void) { wdt_timer_stop = 0; printk("kernel start kick dog...\n"); add_timer(&kick_wdt_timer); mod_timer(&kick_wdt_timer, jiffies); } /* 注意:hi1230平台读写寄存器,通过WDG_WDI 喂外狗 */ static int adm706_wdt_probe(struct platform_device *pdev) { int ret; struct resource *res = NULL; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { printk("watchdog get res fail.\n"); return -ENXIO; } res = request_mem_region(res->start, resource_size(res), pdev->name); if (res == NULL) { printk("watchdog request mem fail.\n"); return -EBUSY; } g_wtd_reg_base_addr_mapped = (uintptr_t)ioremap(res->start, resource_size(res)); adm706_wdt_init(); ret = misc_register(&adm706_wdt_miscdev); if (ret == 0) { printk(KERN_INFO "adm706 watchdog timer: timeout 1.6 sec\n"); if (!nowayout) { printk("Watchdog can be stoped.\n"); } else { printk("Watchdog can not be stopped once started.\n"); } } return ret; } static int adm706_wdt_remove(struct platform_device *pdev) { int error = 0; misc_deregister(&adm706_wdt_miscdev); return error; } static const struct of_device_id adm706_wdt_match[] = { { .compatible = "analog,adm706", }, {}, }; MODULE_DEVICE_TABLE(of, adm706_wdt_match); static struct platform_driver adm706_wdt_driver = { .driver = { .name = "wdt-adm706", .owner = THIS_MODULE, .of_match_table = adm706_wdt_match, }, .probe = adm706_wdt_probe, .remove = adm706_wdt_remove, }; /* pcs may be needed to bring up other drivers */ static int __init adm706_wdt_init_driver(void) { return platform_driver_register(&adm706_wdt_driver); } subsys_initcall(adm706_wdt_init_driver); static void __exit adm706_wdt_exit_driver(void) { platform_driver_unregister(&adm706_wdt_driver); } module_exit(adm706_wdt_exit_driver); module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); MODULE_AUTHOR("Walter"); MODULE_DESCRIPTION("ADM706 watchdog timer driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); 请帮我分析每一段代码的功能逻辑
08-15
这是rt-thread中4G模块U9507的驱动代码,请解释这个驱动代码,并解释清楚每个函数的作用以及运行的逻辑,逐行代码进行解释 /* * File : at_socket_u9507c.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Change Logs: * Date Author Notes * 2019-03-12 liuke first version */ #include <stdio.h> #include <string.h> #include <rtthread.h> #include <rtdevice.h> #include <sys/socket.h> #include <at.h> #include <at_socket.h> #include "at_socket_cfg.h" #if !defined(AT_SW_VERSION_NUM) || AT_SW_VERSION_NUM < 0x10200 #error "This AT Client version is older, please check and update latest AT Client!" #endif #define LOG_TAG "at.u9507c" #include <at_log.h> #ifdef AT_DEVICE_USE_U9507 #define U9507C_MODULE_SEND_MAX_SIZE 1500 #define U9507C_WAIT_CONNECT_TIME 5000 #define U9507C_THREAD_STACK_SIZE 2048 #define U9507C_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX/2) #define U9507C_SOCKET_POS 1 #define U9300_DEVICE_USE 1 /* set real event by current socket and current state */ #define SET_EVENT(socket, event) (((socket + 1) << 16) | (event)) /* AT socket event type */ #define U9507C_EVENT_CONN_OK (1L << 0) #define U9507C_EVENT_SEND_OK (1L << 1) #define U9507C_EVENT_RECV_OK (1L << 2) #define U9507C_EVNET_CLOSE_OK (1L << 3) #define U9507C_EVENT_CONN_FAIL (1L << 4) #define U9507C_EVENT_SEND_FAIL (1L << 5) /* AT+CSTT command default*/ #ifdef USE_SLDY_SIMCARD char *CGDCONT_CHINA_MOBILE = "AT+CGDCONT=1,\"IP\",\"dxcycek.dy.sd\""; #else char *CGDCONT_CHINA_MOBILE = "AT+CGDCONT=1,\"IP\",\"CMNET\""; #endif char *CGDCONT_CHINA_UNICOM = "AT+CGDCONT=1,\"IP\",\"UNINET\""; char *CGDCONT_CHINA_TELECOM = "AT+CGDCONT=1,\"IP\",\"CTNET\""; char net_status = 0; char module_rdy = 0; static rt_event_t at_socket_event; static rt_mutex_t at_event_lock; char recv_sms_flg = 0; static at_evt_cb_t at_evt_cb_set[] = { [AT_SOCKET_EVT_RECV] = NULL, [AT_SOCKET_EVT_CLOSED] = NULL, }; #ifdef GSM_USE_SMS static struct rt_messagequeue mq; char* msm_context = RT_NULL; /* 消息队列中用到的放置消息的内存池 */ static char msg_pool[64]; char* read_sms(void); #endif int get_iemi(char *iemi); static int at_socket_event_send(uint32_t event) { return (int) rt_event_send(at_socket_event, event); } static int at_socket_event_recv(uint32_t event, uint32_t timeout, rt_uint8_t option) { int result = 0; rt_uint32_t recved; result = rt_event_recv(at_socket_event, event, option | RT_EVENT_FLAG_CLEAR, timeout, &recved); if (result != RT_EOK) { return -RT_ETIMEOUT; } return recved; } /** * close socket by AT commands. * * @param current socket * * @return 0: close socket success * -1: send AT commands error * -2: wait socket event timeout * -5: no memory */ static int u9507c_socket_close(int socket) { int result = 0; at_response_t resp = RT_NULL; resp = at_create_resp(64, 2, rt_tick_from_millisecond(2 * 1000)); if (!resp) { LOG_E("No memory for response structure!"); return -RT_ENOMEM; } /* default connection timeout is 10 seconds, but it set to 1 seconds is convenient to use.*/ result = at_exec_cmd(RT_NULL, "AT+MIPCLOSE=%d", socket+U9507C_SOCKET_POS); if (result < 0) { LOG_E("socket (%d) close failed, wait close OK timeout or ERROR.", socket); } if (resp) { at_delete_resp(resp); } return result; } /** * create TCP/UDP client or server connect by AT commands. * * @param socket current socket * @param ip server or client IP address * @param port server or client port * @param type connect socket type(tcp, udp) * @param is_client connection is client * * @return 0: connect success * -1: connect failed, send commands error or type error * -2: wait socket event timeout * -5: no memory */ static int u9507c_socket_connect(int socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client) { int result = 0, event_result = 0; rt_bool_t retryed = RT_FALSE; RT_ASSERT(ip); RT_ASSERT(port >= 0); /* lock AT socket connect */ rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); __retry: if (is_client) { switch (type) { case AT_SOCKET_TCP: /* send AT commands(eg: AT+QIOPEN=0,"TCP","x.x.x.x", 1234) to connect TCP server */ if (at_exec_cmd(RT_NULL, "AT+MIPOPEN=%d,0,\"%s\",%d,0", socket+U9507C_SOCKET_POS, ip, port) < 0) { result = -RT_ERROR; goto __exit; } break; case AT_SOCKET_UDP: if (at_exec_cmd(RT_NULL, "AT+MIPOPEN=%d,0,\"%s\",%d,1", socket+U9507C_SOCKET_POS, ip, port) < 0) { result = -RT_ERROR; goto __exit; } break; default: LOG_E("Not supported connect type : %d.", type); result = -RT_ERROR; goto __exit; //break; } } /* waiting result event from AT URC, the device default connection timeout is 75 seconds, but it set to 10 seconds is convenient to use.*/ if (at_socket_event_recv(SET_EVENT(socket, 0), rt_tick_from_millisecond(30 * 1000), RT_EVENT_FLAG_OR) < 0) { LOG_E("socket (%d) connect failed, wait connect result timeout.", socket); result = -RT_ETIMEOUT; goto __exit; } /* waiting OK or failed result */ if ((event_result = at_socket_event_recv(U9507C_EVENT_CONN_OK | U9507C_EVENT_CONN_FAIL, rt_tick_from_millisecond(30 * 1000), RT_EVENT_FLAG_OR)) < 0) { LOG_E("socket (%d) connect failed, wait connect OK|FAIL timeout.", socket); result = -RT_ETIMEOUT; goto __exit; } /* check result */ if (event_result & U9507C_EVENT_CONN_FAIL) { if (!retryed) { LOG_E("socket (%d) connect failed, maybe the socket was not be closed at the last time and now will retry.", socket); if (u9507c_socket_close(socket) < 0) { goto __exit; } retryed = RT_TRUE; goto __retry; } LOG_E("socket (%d) connect failed, failed to establish a connection.", socket); result = -RT_ERROR; goto __exit; } __exit: if(result != 0) { u9507c_socket_close(socket); } /* unlock AT socket connect */ rt_mutex_release(at_event_lock); return result; } /** * send data to server or client by AT commands. * * @param socket current socket * @param buff send buffer * @param bfsz send buffer size * @param type connect socket type(tcp, udp) * * @return >=0: the size of send success * -1: send AT commands error or send data error * -2: waited socket event timeout * -5: no memory */ static int u9507c_socket_send(int socket, const char *buff, size_t bfsz, enum at_socket_type type) { int result = 0, event_result = 0; at_response_t resp = RT_NULL; RT_ASSERT(buff); resp = at_create_resp(2048, 2, rt_tick_from_millisecond(5000)); if (!resp) { LOG_E("No memory for response structure!"); return -RT_ENOMEM; } rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); at_set_end_sign('>'); // bfsz > 1000 ? (bfsz=800) : (bfsz = bfsz); /* set current socket for send URC event */ { if (at_exec_cmd(resp, "AT+MIPTPS=3,%d,2000,%d", socket+U9507C_SOCKET_POS,bfsz) < 0) { result = -RT_ERROR; goto __exit; } /* send the real data to server or client */ result = (int) at_client_send(buff,bfsz); if (result == 0) { result = -RT_ERROR; goto __exit; } /* waiting result event from AT URC */ if (at_socket_event_recv(SET_EVENT(socket, 0), rt_tick_from_millisecond(5 * 1000), RT_EVENT_FLAG_OR) < 0) { LOG_E("socket (%d) send failed, wait connect result timeout.", socket); result = -RT_ETIMEOUT; goto __exit; } /* waiting OK or failed result */ if ((event_result = at_socket_event_recv(U9507C_EVENT_SEND_OK | U9507C_EVENT_SEND_FAIL, rt_tick_from_millisecond(5 * 1000), RT_EVENT_FLAG_OR)) < 0) { LOG_E("socket (%d) send failed, wait connect OK|FAIL timeout.", socket); result = -RT_ETIMEOUT; goto __exit; } /* check result */ if (event_result & U9507C_EVENT_SEND_FAIL) { LOG_E("socket (%d) send failed, return failed.", socket); result = -RT_ERROR; goto __exit; } else { result = bfsz; } } if(event_result & U9507C_EVENT_SEND_OK) { } __exit: /* reset the end sign for data conflict */ at_set_end_sign(0); rt_mutex_release(at_event_lock); if (resp) { at_delete_resp(resp); } return result; } /** * domain resolve by AT commands. * http://xiantech.vicp.net:8888/update/JSMO2O2G.rbl * @param name domain name * @param ip parsed IP address, it's length must be 16 * * @return 0: domain resolve success * -1: send AT commands error or response error * -2: wait socket event timeout * -5: no memory */ static int u9507c_domain_resolve(const char *name, char ip[16]) { #define RESOLVE_RETRY 5 int i, result = RT_EOK; char recv_ip[16] = { 0 }; at_response_t resp = RT_NULL; RT_ASSERT(name); RT_ASSERT(ip); /* The maximum response time is 14 seconds, affected by network status */ resp = at_create_resp(128, 4, rt_tick_from_millisecond(14 * 1000)); if (!resp) { LOG_E("No memory for response structure!"); return -RT_ENOMEM; } rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); for(i = 0; i < RESOLVE_RETRY; i++) { if (at_exec_cmd(resp, "AT+MIPDNSR=\"%s\"", name) < 0) { result = -RT_ERROR; goto __exit; } /* parse the third line of response data, get the IP address */ // +MIPDNSR:118.24.195.65 if(at_resp_parse_line_args_by_kw(resp, "+MIPDNSR:", "+MIPDNSR:%s", recv_ip) < 0) { rt_thread_delay(rt_tick_from_millisecond(100)); /* resolve failed, maybe receive an URC CRLF */ continue; } if (strlen(recv_ip) < 8) { rt_thread_delay(rt_tick_from_millisecond(100)); /* resolve failed, maybe receive an URC CRLF */ continue; } else { strncpy(ip, recv_ip, 15); ip[15] = '\0'; break; } } __exit: rt_mutex_release(at_event_lock); if (resp) { at_delete_resp(resp); } return result; } /** * set AT socket event notice callback * * @param event notice event * @param cb notice callback */ static void u9507c_socket_set_event_cb(at_socket_evt_t event, at_evt_cb_t cb) { if (event < sizeof(at_evt_cb_set) / sizeof(at_evt_cb_set[1])) { at_evt_cb_set[event] = cb; } } static void urc_connect_func(const char *data, rt_size_t size) { int socket ; int result = 0; RT_ASSERT(data && size); if(!sscanf(data, "+MIPOPEN=%d,%d", &socket , &result)) { sscanf(data, "+MIPOPEN:%d,%d", &socket , &result); } // LOG_I("Connect server success."); //LOG_I("urc_connect_func data = %s,result = %d .",data,result); if (result == 1) { at_socket_event_send(SET_EVENT(socket-U9507C_SOCKET_POS, U9507C_EVENT_CONN_OK)); } else { at_socket_event_send(SET_EVENT(socket-U9507C_SOCKET_POS, U9507C_EVENT_CONN_FAIL)); } } static void urc_send_func(const char *data, rt_size_t size) { int socket ; int result = 0; RT_ASSERT(data && size); //+MIPPUSH:1,1. sscanf(data, "+MIPPUSH:%d,%d", &socket , &result); //LOG_I("urc_send_func data = %s,socket = %d .",data,result); if(result) { at_socket_event_send(SET_EVENT(socket-U9507C_SOCKET_POS, U9507C_EVENT_SEND_OK)); } else { at_socket_event_send(SET_EVENT(socket-U9507C_SOCKET_POS, U9507C_EVENT_SEND_FAIL)); } } static void urc_close_func(const char *data, rt_size_t size) { int socket = 0 ; RT_ASSERT(data && size); sscanf(data, "+MIPCLOSE:%d,%*s", &socket); if(socket > 0) { if (at_evt_cb_set[AT_SOCKET_EVT_CLOSED]) { at_evt_cb_set[AT_SOCKET_EVT_CLOSED](socket-U9507C_SOCKET_POS, AT_SOCKET_EVT_CLOSED, NULL, 0); } } } static void urc_recv_func(const char *data, rt_size_t size) { int socket = 0; rt_int32_t bfsz = 0,temp_size = 0; rt_int32_t timeout; char *recv_buf = RT_NULL, temp[8];; char readcmd[16],vldp = 0; RT_ASSERT(data && size); /* get the current socket and receive buffer size by receive data */ vldp = sscanf(data, "+MIPRTCP=%d,%d", &socket,&bfsz); //LOG_I("urc_recv_func %d , data = %s , socket = %d , bfsz = %d .\n",vldp,data,socket,bfsz); if(vldp == 0) { vldp = sscanf(data, "+MIPRUDP=%d,%d", &socket,&bfsz); // +MIPRUDP: %*[^,],%*[^,], } if(vldp == 1) { rt_thread_mdelay(120); rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); rt_sprintf(readcmd,"AT+MIPREAD=%d\r\n",socket); at_client_send(readcmd,rt_strlen(readcmd)); // //LOG_I("urc_recv_func readcmd = %s .",readcmd); if(1 == U9300_DEVICE_USE) { // //LOG_I("U9300_DEVICE_USE send ok success !"); at_socket_event_send(SET_EVENT(socket-U9507C_SOCKET_POS, U9507C_EVENT_SEND_OK)); } rt_mutex_release(at_event_lock); return; } timeout = bfsz; /* sync receive data */ recv_buf = rt_calloc(1, bfsz); if (!recv_buf) { LOG_E("no memory for URC receive buffer (%d)!", bfsz); /* read and clean the coming data */ while (temp_size < bfsz) { if (bfsz - temp_size > sizeof(temp)) { at_client_recv(temp, sizeof(temp), timeout); } else { at_client_recv(temp, bfsz - temp_size, timeout); } temp_size += sizeof(temp); } return; } /* sync receive data */ if (at_client_recv(recv_buf, bfsz, timeout) != bfsz) { LOG_E("receive size(%d) data failed!", bfsz); rt_free(recv_buf); return; } //LOG_I("urc_recv_func recv_buf = %s .\n",recv_buf); /* notice the receive buffer and buffer size */ if (at_evt_cb_set[AT_SOCKET_EVT_RECV]) { at_evt_cb_set[AT_SOCKET_EVT_RECV](socket-U9507C_SOCKET_POS, AT_SOCKET_EVT_RECV, recv_buf, bfsz); } } static char ping_sta = 0; static void urc_ping_func(const char *data, rt_size_t size) { static int icmp_seq = 0; int i, j = 0; int result, recv_len = 60, time, ttl= 255; int sent, rcvd, avg; char dst_ip[16] = { 0 }; RT_ASSERT(data); for (i=0;i<size;i++) { if(*(data+i) == '.') j++; } if (j != 0) { //+MPING:220.181.38.148,1,123 sscanf(data, "+MPING:%[^,],%d,%d", dst_ip, &icmp_seq, &time); rt_kprintf("%d bytes from %s icmp_seq=%d ttl=%d time=%d ms\n", recv_len, dst_ip, icmp_seq, ttl, time); } else { //+MPINGSTATE:0,4,4,109 sscanf(data, "+MPINGSTATE: %d,%d,%d,%d", &result, &sent, &rcvd, &avg); if (result == 0) rt_kprintf("%d sent %d received %d lost, average=%dms\n", sent, rcvd, sent - rcvd, avg); else rt_kprintf("Can not found host\n"); ping_sta = 1; } } static void urc_sms_func(const char *data, rt_size_t size) { int msg_pos = 0; rt_kprintf("receive a message\n"); sscanf(data,"+CMTI: %*[^,],%d",&msg_pos); rt_kprintf("msg pos: %d\n",msg_pos); recv_sms_flg = 1; SHOW_STATUS(SMS_TIPS); #ifdef GSM_USE_SMS rt_mq_send(&mq, &msg_pos, sizeof(int)); #endif } #if 1 static void urc_func(const char *data, rt_size_t size) { int mode = 0; RT_ASSERT(data); LOG_I("URC data : %.*s", size, data); if(sscanf(data,"^MODE: %d",&mode)) { if(mode == 0) net_status = 0; else module_rdy = 1; } } #endif static const struct at_urc urc_table[] = { {"+MIPOPEN", "\r\n", urc_connect_func}, {"+MIPCLOSE:", "\r\n", urc_close_func}, {"+MIPRTCP", "\r\n", urc_recv_func}, {"+MIPRUDP", "\r\n", urc_recv_func}, {"^MODE:", "\r\n", urc_func}, {"+CMTI:", "\r\n", urc_sms_func}, {"+MPING:", "\r\n", urc_ping_func}, {"+MPINGSTATE:", "\r\n", urc_ping_func}, {"+MIPPUSH", "\r\n", urc_send_func}, }; #define AT_SEND_CMD(resp, resp_line, timeout, cmd) \ do \ { \ if (at_exec_cmd(at_resp_set_info(resp, 128, resp_line, rt_tick_from_millisecond(timeout)), cmd) < 0) \ { \ result = -RT_ERROR; \ goto __exit; \ } \ } while(0); \ /** * 读GPRS接收到的短信 * * 输入参数: 无 * * 输出参数: RT_NULL : 没有读到短信 * char * : 读到短信内容的指针 */ #ifdef GSM_USE_SMS char* read_sms(void) { int result = 0; char cmd_buf[15] = {0}; const char *message = RT_NULL; at_response_t resp = RT_NULL; int msg_pos = 0; result = rt_mq_recv(&mq, &msg_pos, sizeof(int),RT_WAITING_FOREVER);//RT_TICK_PER_SECOND); if(result != RT_EOK) { return RT_NULL; } resp = at_create_resp(128, 4, rt_tick_from_millisecond(300)); rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); rt_sprintf(cmd_buf,"AT+CMGR=%d",msg_pos); AT_SEND_CMD(resp, 0, 300, cmd_buf); // 读取信息内容 message = at_resp_get_line(resp,3); msm_context = rt_malloc(rt_strlen(message)); if(msm_context != RT_NULL) { memcpy(msm_context,message,rt_strlen(message)); } rt_sprintf(cmd_buf,"AT+CMGD=%d,4",msg_pos); AT_SEND_CMD(resp, 0, 25*1000, cmd_buf); // 删除该条短信 __exit: rt_mutex_release(at_event_lock); if (resp) { at_delete_resp(resp); } if(msm_context) { return (char*)msm_context; } else { return RT_NULL; } } //MSH_CMD_EXPORT(read_sms,read message); #endif /* init for U9507C */ void lte_init_thread_entry(void *parameter) { #define CPIN_RETRY 10 #define CSQ_RETRY 20 #define CREG_RETRY 10 #define CGREG_RETRY 20 at_response_t resp = RT_NULL; int i = 0; int mipcall_state=0; char parsed_data[10]; rt_err_t result = RT_EOK; module_rdy = 0; net_status = 0; resp = at_create_resp(128, 0, rt_tick_from_millisecond(300)); if (!resp) { LOG_E("No memory for response structure!"); result = -RT_ENOMEM; goto __exit; } LOG_D("Start initializing the U9507C module"); rt_pin_write(U9507C_POWER_CTL,PIN_LOW); rt_thread_mdelay(5000); rt_pin_write(U9507C_POWER_CTL,PIN_HIGH); rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); module_rdy = 0; while((!module_rdy)&&(i<30)) { i++; rt_thread_mdelay(1000); } i = 0; /* waiting for dirty data to be digested */ wait_connect: /* wait U9507C startup finish */ if (at_client_wait_connect(U9507C_WAIT_CONNECT_TIME)) { if(i++ < 3) { goto wait_connect; } result = -RT_ETIMEOUT; goto __exit; } /* disable echo */ /* get module version */ AT_SEND_CMD(resp, 0, 300, "ATI"); /* show module version */ for (i = 0; i < (int)resp->line_counts - 1; i++) { LOG_D("%s", at_resp_get_line(resp, i + 1)); } i = 0; /* disable echo */ AT_SEND_CMD(resp, 0, 300, "ATE0"); /* check SIM card */ for (i = 0; i < CPIN_RETRY; i++) { at_exec_cmd(at_resp_set_info(resp, 128, 2, rt_tick_from_millisecond(5000)), "AT+CPIN?"); if (at_resp_get_line_by_kw(resp, "READY")) { LOG_D("SIM card detection success"); break; } rt_thread_delay(rt_tick_from_millisecond(1000)); } if (i == CPIN_RETRY) { LOG_E("SIM card detection failed!"); result = -RT_ERROR; goto __exit; } /* check the GSM network is registered */ for (i = 0; i < CREG_RETRY; i++) { AT_SEND_CMD(resp, 0, 300, "AT+CREG?"); at_resp_parse_line_args_by_kw(resp, "+CREG:", "+CREG: %s", &parsed_data); if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data))) { LOG_D("GSM network is registered (%s)", parsed_data); break; } rt_thread_delay(rt_tick_from_millisecond(1000)); } if (i == CREG_RETRY) { /* check the GPRS network is registered */ for (i = 0; i < CGREG_RETRY; i++) { AT_SEND_CMD(resp, 0, 300, "AT+CGREG?"); at_resp_parse_line_args_by_kw(resp, "+CGREG:", "+CGREG: %s", &parsed_data); if (!strncmp(parsed_data, "0,1", sizeof(parsed_data)) || !strncmp(parsed_data, "0,5", sizeof(parsed_data))) { LOG_D("GPRS network is registered (%s)", parsed_data); break; } rt_thread_delay(rt_tick_from_millisecond(1000)); } if (i == CGREG_RETRY) { LOG_E("The GPRS network is register failed (%s)", parsed_data); result = -RT_ERROR; goto __exit; } } /* check signal strength */ for (i = 0; i < CSQ_RETRY; i++) { AT_SEND_CMD(resp, 0, 300, "AT+CSQ"); at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %s", &parsed_data); if (strncmp(parsed_data, "99,99", sizeof(parsed_data))) { sscanf(parsed_data,"%d,%*s", &SignalStrength); LOG_D("Signal strength: %s", parsed_data); break; } rt_thread_delay(rt_tick_from_millisecond(1000)); } if (i == CSQ_RETRY) { LOG_E("Signal strength check failed (%s)", parsed_data); result = -RT_ERROR; goto __exit; } { char cgdcont[64]; rt_sprintf(cgdcont,"AT+CGDCONT=1,\"IP\",\"%s\"",gSysPara.APN); AT_SEND_CMD(resp, 0, 300, "AT+COPS?"); at_resp_parse_line_args_by_kw(resp, "+COPS:", "+COPS: %*[^\"]\"%[^\"]", &parsed_data); if (strcmp(parsed_data, "CHINA MOBILE") == 0) { /* "CMCC" */ LOG_I("%s", parsed_data); AT_SEND_CMD(resp, 0, 500, cgdcont); } else if (strcmp(parsed_data, "CHN-UNICOM") == 0) { /* "UNICOM" */ LOG_I("%s", parsed_data); AT_SEND_CMD(resp, 0, 500, cgdcont); } else if (strcmp(parsed_data, "CHN-CT") == 0) { AT_SEND_CMD(resp, 0, 500, cgdcont); /* "CT" */ LOG_I("%s", parsed_data); } } // AT_SEND_CMD(resp, 0, 150 * 1000, "AT+MIPCLOSE?");//+MIPCLOSE:1 //at_resp_parse_line_args_by_kw(resp, "+MIPCLOSE:", "+MIPCLOSE:%d", &socket_value); // rt_thread_delay(rt_tick_from_millisecond(100)); { extern SysPara gSysPara; char sim_iemi[16]; get_iemi(sim_iemi); if(rt_memcmp(sim_iemi,gSysPara.SIM_IMSI,15)) { rt_memcpy(gSysPara.SIM_IMSI,sim_iemi,15); save_syspara(); } } /* Deactivate context profile */ AT_SEND_CMD(resp, 0, 40 * 1000, "AT+MIPCALL=0"); /* Activate context profile */ AT_SEND_CMD(resp, 0, 150 * 1000, "AT+MIPCALL=1"); /* Query the status of the context profile */ AT_SEND_CMD(resp, 0, 150 * 1000, "AT+MIPCALL?"); //at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %*[^\"]\"%[^\"]", &parsed_data); at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL:%d", &mipcall_state); AT_SEND_CMD(resp, 0, 1000, "AT+CMGF=1"); AT_SEND_CMD(resp, 0, 1000, "AT+CNMI=2,1"); AT_SEND_CMD(resp, 0, 1000, "AT+LSHAUTOWRAPEN?"); rt_thread_mdelay(200); AT_SEND_CMD(resp, 0, 1000, "AT+LSHAUTOWRAPEN=?"); rt_thread_mdelay(200); AT_SEND_CMD(resp, 0, 1000, "AT+LSHAUTOWRAPEN=1"); rt_thread_mdelay(200); AT_SEND_CMD(resp, 0, 1000, "AT+MIPRS=0"); if(mipcall_state == 0) { result = -RT_ERROR; goto __exit; } __exit: rt_mutex_release(at_event_lock); if (resp) { at_delete_resp(resp); } if (!result) { net_status = 1; LOG_I("AT network initialize success!"); } else { net_status = 0; LOG_E("AT network initialize failed (%d)!", result); } } int u9507c_net_init(void) { #ifdef PKG_AT_INIT_BY_THREAD rt_thread_t tid; tid = rt_thread_create("u9507c_net_init", lte_init_thread_entry, RT_NULL, U9507C_THREAD_STACK_SIZE, U9507C_THREAD_PRIORITY, 20); if (tid) { rt_thread_startup(tid); } else { LOG_E("Create AT initialization thread fail!"); } #else u9507c_init_thread_entry(RT_NULL); #endif return RT_EOK; } void net_init(void) { u9507c_net_init(); } int u9507c_ping(int argc, char **argv) { at_response_t resp = RT_NULL; if (argc != 2) { rt_kprintf("Please input: at_ping <host address>.eg:ddress <at_ping \"www.baidu.com\">\n"); return -RT_ERROR; } ping_sta = 0; resp = at_create_resp(128, 0, rt_tick_from_millisecond(5000)); if (!resp) { rt_kprintf("No memory for response structure!\n"); return -RT_ENOMEM; } rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); if (at_exec_cmd(resp, "AT+MPING=\"%s\"", argv[1]) < 0) { rt_kprintf("AT send ping commands error!\n"); return -RT_ERROR; } if (resp) { at_delete_resp(resp); } while(!ping_sta) { rt_thread_mdelay(200); } rt_mutex_release(at_event_lock); return RT_EOK; } int u9507c_ifconfig(void) { at_response_t resp = RT_NULL; char resp_arg[AT_CMD_MAX_LEN] = { 0 }; rt_err_t result = RT_EOK; rt_int32_t value; resp = at_create_resp(128, 2, rt_tick_from_millisecond(300)); if (!resp) { rt_kprintf("No memory for response structure!\n"); return -RT_ENOMEM; } rt_mutex_take(at_event_lock, RT_WAITING_FOREVER); /* Query the status of the context profile */ AT_SEND_CMD(resp, 0, 5 * 1000, "AT+MIPCALL?"); at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL: %d,%s", &value,&resp_arg); rt_kprintf("IP adress : %s\n", resp_arg); __exit: rt_mutex_release(at_event_lock); if (resp) { at_delete_resp(resp); } return result; } int u9507c_connect(int argc, char **argv) { int32_t port; if (argc != 3) { rt_kprintf("Please input: at_connect <host address> <port> eg:<at_connect \"113.140.31.150\" 60119>\n"); return -RT_ERROR; } sscanf(argv[2],"%d",&port); if(0 == u9507c_socket_connect(0, argv[1], port, AT_SOCKET_TCP, 1)) { rt_kprintf("Connect success!\n"); } else { rt_kprintf("Connect failed!\n"); } return RT_EOK; } int u9507c_close(int argc, char **argv) { if (u9507c_socket_close(0) < 0) { rt_kprintf("u9507c_socket_close fail\n"); } else { rt_kprintf("u9507c_socket_closeed\n"); } return RT_EOK; } int u9507c_send(int argc, char **argv) { char buff[16] = {1,2,3,4,5,6,7,8,9,0,0,1,2,0,3,4}; if(argc != 2) { if (u9507c_socket_send(0, buff, sizeof(buff), AT_SOCKET_TCP) < 0) { rt_kprintf("u9507c_socket_send fail\n"); return -RT_ERROR; } return RT_EOK; } if (u9507c_socket_send(0, argv[1], strlen(argv[1]), AT_SOCKET_TCP) < 0) { rt_kprintf("u9507c_socket_send fail\n"); return -RT_ERROR; } return RT_EOK; } int get_iemi(char *iemi) { at_response_t resp = RT_NULL; int result = 0; resp = at_create_resp(128, 4, rt_tick_from_millisecond(300)); if(resp == RT_NULL) { result = -RT_ERROR; goto __exit; } if(iemi == RT_NULL) { result = -RT_ERROR; goto __exit; } AT_SEND_CMD(resp, 0, 150 * 1000, "AT+CIMI"); at_resp_parse_line_args(resp,2, "%s", iemi); LOG_I("IEMI : %s",iemi); result = RT_EOK; __exit: at_delete_resp(resp); return result; } int net_status_check(void) { at_response_t resp = RT_NULL; int result = 0; int netsta; resp = at_create_resp(128, 4, rt_tick_from_millisecond(300)); if(resp == RT_NULL) { result = -RT_ERROR; goto __exit; } if(rt_mutex_take(at_event_lock, 1000) != RT_EOK) { goto get_event_timeout; } AT_SEND_CMD(resp, 0, 1000, "AT+CSQ"); at_resp_parse_line_args_by_kw(resp, "+CSQ:", "+CSQ: %d,%*d", &SignalStrength); // LOG_I("SignalStrength = %d",SignalStrength); AT_SEND_CMD(resp, 0, 1000, "AT+MIPCALL?"); at_resp_parse_line_args_by_kw(resp, "+MIPCALL:", "+MIPCALL:%d,%*s", &netsta); if(netsta == 0) { net_status = 0; LOG_W("No net registered!"); } __exit: rt_mutex_release(at_event_lock); get_event_timeout: at_delete_resp(resp); return result; } #ifdef FINSH_USING_MSH #include <finsh.h> MSH_CMD_EXPORT_ALIAS(u9507c_net_init, at_net_init, initialize AT network); MSH_CMD_EXPORT_ALIAS(u9507c_ping, ping, AT ping network host); MSH_CMD_EXPORT_ALIAS(u9507c_ifconfig, ifconfig, list the information of network interfaces); MSH_CMD_EXPORT_ALIAS(u9507c_connect, at_connect, AT connect network host); MSH_CMD_EXPORT_ALIAS(u9507c_send, at_send, AT send a pack); MSH_CMD_EXPORT_ALIAS(u9507c_close, at_close, AT close a socket); #endif static const struct at_device_ops u9507c_socket_ops = { u9507c_socket_connect, u9507c_socket_close, u9507c_socket_send, u9507c_domain_resolve, u9507c_socket_set_event_cb, }; static int at_socket_device_init(void) { rt_pin_mode(U9507C_POWER_CTL,PIN_MODE_OUTPUT); rt_pin_write(U9507C_POWER_CTL,PIN_LOW); /* create current AT socket event */ at_socket_event = rt_event_create("at_se", RT_IPC_FLAG_FIFO); if (at_socket_event == RT_NULL) { LOG_E("AT client port initialize failed! at_sock_event create failed!"); return -RT_ENOMEM; } /* create current AT socket event lock */ at_event_lock = rt_mutex_create("at_se", RT_IPC_FLAG_FIFO); if (at_event_lock == RT_NULL) { LOG_E("AT client port initialize failed! at_sock_lock create failed!"); rt_event_delete(at_socket_event); return -RT_ENOMEM; } #ifdef GSM_USE_SMS /* 初始化消息队列 */ rt_mq_init(&mq, "mqt", &msg_pool[0], /* 内存池指向msg_pool */ sizeof(int), /* 每个消息的大小是 128 - void* */ sizeof(msg_pool), /* 内存池的大小是msg_pool的大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ #endif /* initialize AT client */ at_client_init("uart1", AT_DEVICE_RECV_BUFF_LEN); // AT_DEVICE_NAME /* register URC data execution function */ at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0])); /* initialize u9507c network */ u9507c_net_init(); #ifdef GSM_USE_SMS extern int sms_process_init(); sms_process_init(); #endif /* set u9507c AT Socket options */ at_socket_device_register(&u9507c_socket_ops); return RT_EOK; } INIT_APP_EXPORT(at_socket_device_init); void net_status_entry(void *paramter) { while(1) { rt_thread_mdelay(30*RT_TICK_PER_SECOND); net_status_check(); } } int net_status_task(void) { rt_thread_t init_thread; init_thread = rt_thread_create("netsta", net_status_entry, RT_NULL, 2048, 30, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); return 0; } INIT_APP_EXPORT(net_status_task); #endif /* AT_DEVICE_U9507C */
12-02
#define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
最新发布
12-22
### 代码用途 这段C语言定义代码的主要用途是为音符对应的频率值定义常量,方便在程序中使用。在音乐相关的程序开发中,要根据不同的音符来发出特定频率的声音,通过这些定义可以清晰、准确地指定每个音符的频率。例如,在开发简易音乐播放器、音乐游戏或者音乐合成器等程序时,能够直接使用这些常量来表示音乐中的各个音符频率。 ### 优化建议 - **减少重复定义**:如果存在一些音符频率在不同的音乐场景下经常组合使用,可以进一步定义包含多个音符频率的数组或结构体,以减少代码的重复引用。 ```c // 定义一个常见的八度音符频率数组 #define NUM_NOTES_IN_OCTAVE 12 const int octave_notes[NUM_NOTES_IN_OCTAVE] = { NOTE_C1, NOTE_CS1, NOTE_D1, NOTE_DS1, NOTE_E1, NOTE_F1, NOTE_FS1, NOTE_G1, NOTE_GS1, NOTE_A1, NOTE_AS1, NOTE_B1 }; ``` - **使用枚举类型**:对于音符的表示,使用枚举类型可以提高代码的可读性和可维护性。 ```c typedef enum { B0 = NOTE_B0, C1 = NOTE_C1, CS1 = NOTE_CS1, // 其他音符... D8 = NOTE_D8 } Note; ``` - **模块化管理**:将这些音符频率的定义单独放在一个头文件中,例如`notes.h`,然后在需要使用的源文件中包含这个头文件,这样可以使代码结构更加清晰。 ### 应用场景 - **音乐播放**:在开发音乐播放程序时,根据乐谱中的音符序列,使用这些频率常量控制扬声器发出相应频率的声音,实现音乐的播放。 ```c #include <stdio.h> #include <unistd.h> #include <wiringPi.h> // 假设使用树莓派的wiringPi库控制扬声器 #define SPEAKER_PIN 1 void play_note(int frequency, int duration) { // 这里简单模拟播放音符,实际需要根据硬件进行实现 // 例如使用定时器产生PWM信号 printf("Playing note with frequency %d Hz for %d ms\n", frequency, duration); usleep(duration * 1000); } int main() { wiringPiSetup(); pinMode(SPEAKER_PIN, OUTPUT); // 播放一个简单的音符序列 play_note(NOTE_C4, 500); play_note(NOTE_D4, 500); play_note(NOTE_E4, 500); return 0; } ``` - **音乐教育软件**:在音乐教育软件中,通过这些常量可以直观地展示音符和频率之间的关系,帮助用户更好地理解音乐理论。 - **音频合成**:在音频合成领域,根据音乐的节奏和音符,使用这些频率常量结合音频合成算法,生成各种音乐效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值