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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# |0 X4 {: d% N9 r6 h/ c* Z2 x  \! u# e5 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 ?1 B+ |( g0 K& C#include <unistd.h># B, |8 i& x4 ~/ B& L
#include <sys/mman.h>
) B$ M$ @# F( H#include <sys/types.h>0 x- ?& {' I7 g. A) K2 A! E
#include <fcntl.h>) B6 L# e) d: |, g' i3 o  ~

+ e6 {& f3 V- ]# k: a! ]" h9 n; Y) {#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; ?" S2 O1 Y$ X4 M/ _+ F
. \$ b. |: Q: t& M) U3 Otypedef struct
5 k" o5 T. J5 z{
. {2 j5 ^& W; D: S! o        unsigned int a;
* v4 k" y& R- D5 r7 Z        unsigned int b;# P5 P) `! g1 [9 {3 o
        unsigned int packet_cout;3 g- I7 j( H) @; H  N' v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; v5 L0 m9 Y' z! {0 |4 q

/ J4 `# T( |, ?' l: B$ `5 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ o, s2 ]; y  t  w' wunsigned int count_copy = 0;2 Q) T/ |& [* {0 ~5 A# N
  m! ?2 ?4 W& b% }
# w& d+ p# E/ X  y2 i  ]
int main()
6 `. I$ D3 z8 ]& W$ ?: g  W{( V. D9 \) P' k; |# G
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 L+ `0 O9 C2 U2 s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, M& L; e6 `8 E" o0 X& f
. a( o. B, d, m        while(1)
' Y) r/ Z) `! j+ k% n        {
' R" f8 f( E! [' l                read_MSG_buffer(pshreRAM);
- \% h4 N* l6 n  ^( D        }                5 \2 N4 g( N( T- u8 w$ S1 n  h" _
}
' F  U# J- I8 |9 V2 [- Y5 D& c* o5 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- u7 C. \/ e2 E) Q; Q+ J{2 R0 ]( x8 S2 ]5 W
        RX_MSG_PROTOCOL buf;
2 S! B* S5 e" C  Y        3 p  G' ^% [# b2 ?0 R: m0 a! Q
        buf.a = pshreRAM->a;
: F. w  i* E* ?% \" F9 C3 f1 W        buf.b = pshreRAM->b;
8 v! r: k& @- q; N6 ~/ V        buf.packet_cout = pshreRAM->packet_cout;9 J4 j6 V5 u+ z, X$ R5 T
        4 r& Q. k% n5 r. w1 I
        if(buf.packet_cout != count_copy)
; n" S8 G8 s1 I0 B4 r        {' L: s' u: p. A
                printf("a is %d\n", buf.a);/ w4 G: ^3 W: R$ v- b
                printf("b is %d\n", buf.b);
4 i7 ^8 _. N# {0 Y: z; _                printf("count is %d\n", buf.packet_cout);
/ _4 X  Z3 s8 v" R. ~9 {                count_copy = buf.packet_cout;
7 D  H( C; u9 X. d  N        }
5 l$ F( H9 ]1 u: P& K* T4 o        else
9 H6 B7 o" F7 ~% U        {: T. u2 R6 c& `5 q7 w/ ]% q
                printf("No effective message!");
! D8 A! S) b& r4 o8 e! q/ }2 o        }$ ~! u. ?- H, z
}! N) G% x, N+ w$ E* L

# s1 _! V' o' S
; j* R1 Y6 y. |' Q7 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( D; P; b6 C2 H, a/ |/ b: t+ H使用下面代码,对内存使用了mmap函数后:1 }7 p, O' ?# V- m; c& U& D8 Q
#include <stdio.h>
# s$ M6 S: {& j6 p0 W- i3 p#include <unistd.h>
/ p' V& }) B0 {# q; `) ^. k#include <sys/mman.h>
  o4 O: k! v7 m* R6 O5 O$ n#include <sys/types.h>
; ]* O$ V$ G$ I3 v$ D2 h#include <fcntl.h>
6 [5 b6 g6 ?  `2 |/ S
; j1 z: p. x0 M# K0 k; B#define SHAER_RAM_BASE_ADDR    (0x80000000)
# j! i3 o8 P- y#define SHAER_RAM_SIZE         (0x20000)   . \8 b" \+ F0 B- ?' b  r

$ {4 \' C) @8 [/ _* J. k4 xtypedef struct
0 W3 Z, j, m# B" ]{4 N& I- d4 i/ M  k
        unsigned int a;- ^9 e5 S" I) U: i
        unsigned int b;( A' V; S. p. a4 {
        unsigned int packet_cout;1 x4 V. h+ E5 i% e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 b5 S" s4 m2 B1 p" x

9 q5 m2 t+ |0 S/ \9 J4 fvoid read_MSG_buffer(int *baseaddr);
4 M0 c+ r1 I# gunsigned int count_copy = 0;% S% U2 M9 C& c% e% i4 l
! `% u. M. d8 J6 z
int main()
5 w0 d* u4 K3 ?+ N2 _) V{3 s1 t. u/ n, i: T
        int fd;3 d2 B, i  u8 U$ K) s3 Q# b
        int *mem = NULL;5 h" D$ h' m* j0 f# `! R  ~

# G- p) S  Y! l4 O% P" ?& [        if((fd = open("/dev/mem", O_RDWR)) <0)
2 @6 l) A' G% C3 ^8 R# `4 k        {& o3 q& `* s" z
                perror("open error");
+ s# o4 G4 W( {& o! r                return -1;
2 U+ |/ g5 U4 }; }        }
8 r$ b- k5 N' L/ Y# S' y% Z! S        
" z" N& y: S! c: y. B+ ]0 o        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 \% v4 \% X% I/ X4 V$ G- y: l$ ^( @- @+ e4 B$ [* J
        while(1)
& P; C# c, A" p- E0 ?5 z( B  }6 w        {. t, t- C: v% k- l1 o3 A
                read_MSG_buffer(mem);
- |: U2 i# I5 z% @2 T! }        }                1 g7 M5 Q; X8 z
}
! B/ [, d, t) _7 f! b
  u5 E2 M% x+ _, \5 Svoid read_MSG_buffer(int *baseaddr)
. Q9 {1 x/ u  `# C{
# y0 b6 Y, z4 ]0 O        pRX_MSG_PROTOCOL pshreRAM = NULL;
* d4 T' V. O4 z" A2 R0 ]
5 g7 O( ^0 z; Q  y# u  Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  l: y* j* ?% `% l
1 U$ D: X1 j1 ?& U/ g" s        if(pshreRAM->packet_cout != count_copy)+ k1 s  K& H) o* |
        {
( |: K2 t2 x9 K. ~( i- D1 J                printf("a is %d\n", pshreRAM->a);
/ V+ a- f" A* M" N                printf("b is %d\n", pshreRAM->b);9 g0 o9 o) N1 |' s! F& B! r' `' H
                printf("count is %d\n", pshreRAM->packet_cout);
, B7 x( v& I+ ^1 g8 \/ Y& M7 G                count_copy = pshreRAM->packet_cout;
2 j1 ?8 ~" @" [, o7 S' N, f. r        }% I( }3 \4 O! A
        else
3 F$ \9 @6 U) z' x) a4 ^        {
3 B6 p& p% Q4 W- R                printf("No effective message!\n");9 i# C5 U' c" l& g5 g
        }1 T6 F+ K  D+ b6 v/ N6 V# |3 F
}
2 G! \1 O/ E  Q6 c2 O& O0 H) x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! T, S* G9 V( O2 R/ q7 Z2 b5 }; l

: V5 |' D- |6 Z) g  y6 h/ S7 o/ y! C, i; ?# ^) o
" v8 m& [0 r5 A' {) s" y

  l* R8 Y# s0 X3 K( H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 06:57 , Processed in 0.037357 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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