IAR中实现内联函数 inline

IAR中实现内联函数 inline

在IAR中的写法如下:
#pragma inline
int GetTwoByte(const char *cmd,int pos)
{
    return ((((int)*(cmd+pos))<<8)|(((int)*(cmd+pos+1))<<0));
}
在Keil中的写法如下:
__inline int GetTwoByte(const char *cmd,int pos)
{
    return ((((int)*(cmd+pos))<<8)|(((int)*(cmd+pos+1))<<0));
}

为什么使用内联函数

函数是一种更高级的抽象。它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现;函数的引入可以减少程序的目标代码,实现程序代码和数据的共享。但是,函数调用也会带来降低效率的问题,因为调用函数实际上将程序执行顺序转移到函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。特别是对于一些函数体代码不是很大,但又频繁地被调用的函数来讲,解决其效率问题更为重要。引入内联函数实际上就是为了解决这一问题。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。显然,这种做法不会产生转去转回的问题,但是由于在编译时将函数休中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里提供一个基于IAR Embedded Workbench的ESP8266与ONENET连接的代码示例。请注意,这只是一个简单的示例,您需要根据您的具体情况进行调整。 ```C #include <stdio.h> #include <string.h> #include "stm32f10x.h" #define ESP8266_RX_BUFFER_SIZE 256 #define HTTP_BUFFER_SIZE 1024 uint8_t esp8266_rx_buffer[ESP8266_RX_BUFFER_SIZE]; uint8_t http_buffer[HTTP_BUFFER_SIZE]; uint16_t esp8266_rx_buffer_index = 0; uint8_t http_buffer_index = 0; void esp8266_send_command(char* command); void esp8266_send_data(char* data); void esp8266_reset_buffer(); void esp8266_parse_response(); void http_request(char* method, char* url, char* api_key, char* data); int main(void) { // 初始化ESP8266模块 esp8266_send_command("AT+RST"); // 复位ESP8266 esp8266_send_command("AT+CWMODE=1"); // 设置为Station模式 esp8266_send_command("AT+CWJAP=\"your_wifi_ssid\",\"your_wifi_password\""); // 连接到WiFi网络 // 连接到ONENET平台 esp8266_send_command("AT+CIPMUX=1"); // 允许多路连接 esp8266_send_command("AT+CIPSTART=0,\"TCP\",\"api.heclouds.com\",80"); // 连接到ONENET服务器 while (1) { // 发送数据到ONENET平台 char data[32] = "hello world"; // 发送的数据 http_request("POST", "/devices/your_onenet_device_id/datapoints", "your_onenet_api_key", data); delay_ms(10000); // 每10秒发送一次数据 } } void esp8266_send_command(char* command) { esp8266_reset_buffer(); printf("%s\r\n", command); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '\n') { esp8266_parse_response(); break; } else if (c != '\r') { esp8266_rx_buffer[esp8266_rx_buffer_index++] = c; } } } } void esp8266_send_data(char* data) { esp8266_reset_buffer(); char command[64]; sprintf(command, "AT+CIPSEND=0,%d", strlen(data)); printf("%s\r\n", command); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '>') { break; } } } printf("%s\r\n", data); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '\n') { esp8266_parse_response(); break; } } } } void esp8266_reset_buffer() { memset(esp8266_rx_buffer, 0, ESP8266_RX_BUFFER_SIZE); esp8266_rx_buffer_index = 0; } void esp8266_parse_response() { if (strstr((char*) esp8266_rx_buffer, "OK") != NULL) { // 命令执行成功 } else if (strstr((char*) esp8266_rx_buffer, "ERROR") != NULL) { // 命令执行失败 } else { // 其他响应 } } void http_request(char* method, char* url, char* api_key, char* data) { esp8266_reset_buffer(); char request[256]; sprintf(request, "%s %s HTTP/1.1\r\n", method, url); sprintf(request, "%sHost: api.heclouds.com\r\n", request); sprintf(request, "%sapi-key: %s\r\n", request, api_key); sprintf(request, "%sContent-Type: application/json\r\n", request); sprintf(request, "%sContent-Length: %d\r\n", request, strlen(data)); sprintf(request, "%s\r\n%s", request, data); char command[64]; sprintf(command, "AT+CIPSEND=0,%d", strlen(request)); printf("%s\r\n", command); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '>') { break; } } } printf("%s\r\n", request); while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '\n') { http_buffer[http_buffer_index] = '\0'; break; } else { http_buffer[http_buffer_index++] = c; } } } http_buffer_index = 0; while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '\n') { http_buffer[http_buffer_index] = '\0'; if (http_buffer_index == 1) { // 响应头结束 break; } http_buffer_index = 0; } else { http_buffer[http_buffer_index++] = c; } } } http_buffer_index = 0; while (1) { if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { uint8_t c = USART_ReceiveData(USART1); if (c == '\n') { http_buffer[http_buffer_index] = '\0'; break; } else { http_buffer[http_buffer_index++] = c; } } } // 解析响应数据 char* json_start = strstr((char*) http_buffer, "{"); char* json_end = strstr((char*) http_buffer, "}"); if (json_start != NULL && json_end != NULL) { int json_len = json_end - json_start + 1; char json[json_len]; strncpy(json, json_start, json_len); printf("%s\r\n", json); } } ``` 在这个例子,我们使用STM32F103C8T6开发板和ESP8266模块。我们首先连接到WiFi网络,然后连接到ONENET平台。在`main()`函数,我们每10秒发送一次数据到ONENET平台。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值