OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5167|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # B) C8 r$ r5 {4 I3 h8 P
6 W% `$ K& }! O9 ?( A. [1 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: t8 o  k, ?1 k2 J3 \2 |#include <unistd.h>- I; F, _3 f$ @; y
#include <sys/mman.h>
7 @' B( j& @, U4 f! k- |#include <sys/types.h>
* p8 W% I6 b) |' W#include <fcntl.h>
4 y. c9 B' u- {( `* B4 p8 r* K6 z, F  g; D6 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! M6 d, ~9 f# {& }' M
7 b' `9 d, z! O9 Z8 `  N0 S
typedef struct2 C  M; Z# t; J2 w; o
{" {% a$ K1 n! F- Y" O- Q
        unsigned int a;% J) i0 [) R% ?* s
        unsigned int b;: g( l: T) v- K$ f
        unsigned int packet_cout;, _" j# |$ t0 C9 ~# J% u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* c2 i( Q, \$ K# y/ t& Z
! ~0 Y) M4 I" ]6 H; d: R* G$ f& }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# L; ?3 ^6 z9 t; Aunsigned int count_copy = 0;% C$ H. q- f2 ]& R4 b1 H

+ S* A' T0 ]/ K6 b# f! A, w4 ], }4 n. w1 S: K* r2 H6 f! |
int main()
6 Z- R# m3 L! m{
, T5 h* V( \/ Y, g        pRX_MSG_PROTOCOL pshreRAM = NULL;, K. A4 R; V4 \- O# c2 {/ c* \2 k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* G/ I+ O! l5 R
1 \/ J" x, p; A5 p( D; e7 N
        while(1)
1 e6 l8 C1 i( K& g        {( O( P* R* s* S% `+ M3 w
                read_MSG_buffer(pshreRAM);- e5 \, }$ t5 i2 \0 O2 s$ d
        }                6 r9 ?3 u% Y7 \
}5 }( H8 Z$ ]2 |' ]/ R
3 O: Y4 _8 M% E  z" a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* K) H: J' \$ k" p, _8 n{$ s- J' q# W! Y9 Z4 e: `
        RX_MSG_PROTOCOL buf;
5 T+ O9 W( I. h( Y        
- k9 D) W$ D" ~" {        buf.a = pshreRAM->a;
# W9 y2 S- X6 T! y- G4 U6 M        buf.b = pshreRAM->b;
4 N  n/ T/ C% v) g3 t6 s8 c+ B0 J        buf.packet_cout = pshreRAM->packet_cout;4 J% r; W$ N/ ]3 a' \; ]& \
        
4 u4 c, m& a/ X# s% _; y        if(buf.packet_cout != count_copy). @* w0 i1 Z+ E1 O
        {
4 }" P' s' s2 r* k                printf("a is %d\n", buf.a);  g6 I+ j5 m' y8 ^- r- X
                printf("b is %d\n", buf.b);
; b$ {* W# p; Y! y% K0 l4 R                printf("count is %d\n", buf.packet_cout);
3 f; H- L# l3 p9 ~3 n7 x                count_copy = buf.packet_cout;' I1 ?' s( B  ]; S9 o$ |
        }
& I3 B! g( W% R        else
5 t( C2 f- I+ r        {
; \" H0 V" p# H& I4 c7 m4 j* y, Z, A: i+ T                printf("No effective message!");
2 D5 }; }5 [) a  z        }
* X# d  r0 A/ r. [}; M% q2 ]6 H' R3 |6 P

  _6 n0 y1 Q* e2 ?0 p" @! y/ v$ H3 ^4 y) r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) B8 U9 M4 v, y! g( g
使用下面代码,对内存使用了mmap函数后:  x4 L, R% d* ]9 J
#include <stdio.h>
0 ~4 W" K2 L) c4 D3 W) @7 \#include <unistd.h>
, d/ U: D# S, _: a" i#include <sys/mman.h>
: ~6 H. N" k4 q5 ?* A#include <sys/types.h>
" a, V: i, {  b0 N#include <fcntl.h># m  U4 b3 p, V5 y
8 `5 z; r6 N4 ]4 g+ ^1 h  T( ]$ E
#define SHAER_RAM_BASE_ADDR    (0x80000000)' k8 t* g- z- p  P9 {
#define SHAER_RAM_SIZE         (0x20000)   2 I5 a! l: b2 l: y: ?9 f0 S

' Y% Q& n; P7 C* Ctypedef struct9 k' d4 u* p# G+ ?# v/ f
{
1 u% L  z% `, Y2 Y& U  L" u        unsigned int a;
, g8 j4 e$ e5 [8 r& a. Y. z        unsigned int b;" d) [+ k* y9 {7 v- K
        unsigned int packet_cout;) R0 k# D4 L! U' w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" a. O, B2 D: c8 o2 p1 R
% T/ |6 P: x6 r4 o/ T$ i( ?
void read_MSG_buffer(int *baseaddr);; S1 G  E8 d5 E, z
unsigned int count_copy = 0;! W' I. \# Y5 J$ j. |
* V3 y6 x, V& C& a: K! D
int main()
2 T  ?5 k+ N( p* o: L{
, \1 q0 |+ }6 }+ D; n/ g        int fd;
! \& i. t) Y! s7 y        int *mem = NULL;2 q1 G6 `, Y' K6 g" ^
' G: F- V2 ?3 G& {
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 c4 x( V1 l) N* B4 G+ I* ]        {/ X. T+ P: l, C) g" m, [& p& I
                perror("open error");
' y7 `/ N5 P* P/ b2 [8 Q- z# S                return -1;
) c; ^, G9 N4 R8 A        }9 }& o$ ]" v" Y) N; m
        2 o, `+ k5 H# u5 b1 M
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! q& Z0 g, }" [- s- c) F

: m6 Y3 ]" J$ M  r( H8 g; W        while(1)( O5 L4 A& Q4 _" n6 ?9 v
        {, @) d8 c$ \# W  P7 ~' H& m
                read_MSG_buffer(mem);1 S! [4 e0 L1 `& s, T* [
        }                " v" E6 Y$ {, r% {3 D
}
( z& K- @$ I' ?) U( }) h( h4 p6 Y5 K, ^: |
void read_MSG_buffer(int *baseaddr)
6 z$ ]! T. z: d3 n# L, S, x) s{
- C# \; A, n/ A1 o  m- P) e; E        pRX_MSG_PROTOCOL pshreRAM = NULL;% W$ S' v! f* ?, i) ?3 w* s' u% Y

! i8 H! D# \3 @        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 Z5 R/ Z5 x# K/ Y
, K: Z" r) z3 I- l9 [7 @
        if(pshreRAM->packet_cout != count_copy)! P) ]) C& s6 A1 \
        {' F2 _$ B3 t9 q( n6 S
                printf("a is %d\n", pshreRAM->a);
  ~( {: ^( b+ L1 O/ @                printf("b is %d\n", pshreRAM->b);3 n  d/ g8 ~; _' H, q- O) c
                printf("count is %d\n", pshreRAM->packet_cout);
9 K4 ?/ @. `1 W                count_copy = pshreRAM->packet_cout;
' l$ o3 y" X' e- o        }
3 N3 b, ]; k' k+ ^5 |" c# r        else
6 Y: }' o  m& a        {6 R4 _2 Z9 R% R/ z& ]+ l) |
                printf("No effective message!\n");' b. H) r1 _2 C- w
        }/ Y9 {5 m6 `$ [6 X. R
}0 {2 [3 e2 u1 w6 n0 A
/ p0 Q' o. U. [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- I+ Q. F+ @" p& P+ P$ L% A9 Y6 R' s

$ M$ u, J* E$ I6 m' |9 u* u: c
+ t& O- D/ s. ~$ M& a/ y1 D- U. `/ G: O$ D' D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-22 09:27 , Processed in 0.038846 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表