OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 I( Q  c  @+ |. |  r

6 l7 e9 o3 ~5 W4 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ I7 A% V0 Q9 k$ P
#include <unistd.h>/ d2 I" C3 u9 S$ |! O
#include <sys/mman.h>
: m3 [# T5 V  D* @( f#include <sys/types.h>
2 x7 ?: D* F" w% J#include <fcntl.h>
! [" T  i+ p) b# }& I
% s  c/ S% N& `  O! e7 t4 c#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( T8 _* L) C" k2 p, U2 z3 m; [
4 U" k$ o) N+ q. p
typedef struct' e  U+ R+ I- I
{
4 ]2 h5 [  k  y. R7 I$ y        unsigned int a;
+ X; r$ a, u* p4 [8 F" d, s; G6 d        unsigned int b;
9 p  K+ l3 n7 H        unsigned int packet_cout;- r! X& D5 |; F3 |: r7 p1 Q- i, F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 k% j8 c7 V% R  N5 `6 K. }3 O* ]5 U3 ~5 V$ j, S! i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ L9 J4 x* Q6 o
unsigned int count_copy = 0;
; s+ |$ l  y% N5 F6 b7 @9 e0 i
& H; p" a7 K( ]
. g5 p2 L! e7 ~, g; y, B) y4 t& fint main()  H5 a0 p  m9 v- U
{, x1 _' V; h, ]% S7 N/ C. }" Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' o2 c# T5 t( G9 s) q$ Z- C  {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" O0 p7 }7 p) S
# r, ]# L8 ^$ t! N1 t8 i# p5 E
        while(1)
3 G+ U" p3 m. [- s  ^$ _0 B! T        {
/ K5 C1 L* d, `  |& ]$ t- i9 \  u7 D                read_MSG_buffer(pshreRAM);/ I1 K3 `5 v4 }; ~8 T- t) @3 A3 U
        }               
# N5 w0 c0 M8 W( m}
( \" b/ p) {  @3 y; X& m# s
8 ^% a- A( @6 D$ {8 Z# Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; G/ B& X2 u. H! Y* ^) h) E: P1 q{) g  w6 e8 H* S: n3 d# g2 x
        RX_MSG_PROTOCOL buf;
$ A0 c+ z4 r2 D0 G% y5 R# q: g        
2 ~8 ^$ x3 _2 N& ?        buf.a = pshreRAM->a;
6 D" F8 M1 m! {/ k        buf.b = pshreRAM->b;8 f1 d- i8 M0 |. k0 \
        buf.packet_cout = pshreRAM->packet_cout;
/ a+ ]8 L8 A7 @' D# v+ X        
" C0 Z+ S: Y, _7 ^- u7 d        if(buf.packet_cout != count_copy)- O8 ~4 A  y! O8 T: ]/ v0 e0 ]: u
        {9 k" W: Y$ W3 C$ Q) @: }" `1 R
                printf("a is %d\n", buf.a);* ?5 I- y, k. R; K2 p
                printf("b is %d\n", buf.b);
/ g) x  q. K* Z, h                printf("count is %d\n", buf.packet_cout);
/ q- ?3 W9 O% ]  t) v" o) H                count_copy = buf.packet_cout;
- b3 U: n6 v" p& E. P1 {" F9 Q% F        }
& H3 B6 O2 C" I7 ^1 J& g        else) Q9 f3 `/ z! W, N8 p0 |, L
        {
& b+ E# y3 k  C* p7 |( b# y                printf("No effective message!");
( ?) T* h, Z; _        }
, }! R* m9 d6 @3 h}4 U5 \, G& m; e% h

, J6 r' g  }+ x! J) z2 n
, Z9 p- z8 P1 w+ I% |3 L  p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 U) x" [1 W2 M: ^8 B7 h3 {. b6 O! I
使用下面代码,对内存使用了mmap函数后:; L- Z4 W. ~- _7 p' {/ j" F
#include <stdio.h>, c/ F5 t( U8 |4 `5 u; Q! a
#include <unistd.h>
6 {6 D) N- h$ f- c$ w* v3 J#include <sys/mman.h># z" S$ A) c* N9 y
#include <sys/types.h>
' k& A0 _2 z; Q$ k- \" B#include <fcntl.h>
8 l  G5 l. I/ W) d+ m
7 i$ q+ U, b9 K* l6 V8 z#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 |1 q: |/ K8 o# J#define SHAER_RAM_SIZE         (0x20000)   & p5 I) [( Z, m  X" F7 v
( q  U+ r9 A5 Q- M& M  v6 v. }6 Y( x
typedef struct6 W, |# j4 D; W( v: m
{. h2 \  N2 e6 F# [( o1 f5 i
        unsigned int a;
1 n# s* K: n9 t% Z        unsigned int b;
- i: L3 Z5 Y, L, x, J& B        unsigned int packet_cout;" j" W! W! {. R; M" Z7 B' E' _+ F0 x# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 Z' L/ ?7 [5 g) ?. b  N, x1 z
" c1 f* n6 J- u6 @( C8 H: n* tvoid read_MSG_buffer(int *baseaddr);1 S0 v9 `# a/ Q6 \; N7 j0 j$ |; u  U
unsigned int count_copy = 0;
6 u- l- K( W, P1 g
7 X/ t# O, ~- e3 Zint main()
2 l$ F4 M8 q' t5 }( y  T{, N) I+ G8 M3 S3 k7 |/ I
        int fd;" R1 ~  y4 Y7 V2 y. u
        int *mem = NULL;
/ C+ Q7 U- G8 G/ P& X- q
  W; q+ ~3 J" J* |* e7 I* l        if((fd = open("/dev/mem", O_RDWR)) <0)% B* e$ |/ v, s$ l; G
        {
6 M. R- V! r5 M+ U                perror("open error");
9 j& a3 q( }( N0 r  g                return -1;% [  {. s* g% \/ y
        }2 H" M8 n) V* k- z
        2 [; ]- T8 e0 P' q6 W: N  m/ W+ }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 Q# i! k6 U  X+ L2 B9 @

% N- p! q) o6 j( I$ e        while(1)
+ g& D; B4 I; }3 B# G' \        {
* Z1 k" z* z) @0 q* X* j                read_MSG_buffer(mem);, O8 N" y7 n# c! G( [. \
        }                & M( W* ?3 N$ ]: z/ ]- x
}" `; o  q* {; _; ~, D. X: \
7 K2 h6 W7 l2 m5 m. A8 y
void read_MSG_buffer(int *baseaddr)
  u  d6 X* `7 w2 |9 [5 C6 U{; H; n) _" y4 @$ k
        pRX_MSG_PROTOCOL pshreRAM = NULL;! V' K, p2 V) i3 S5 a

! B5 \3 _$ ^! K% \        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: I! L! h9 P) h

% s! `8 F4 Z8 f/ m* E, V        if(pshreRAM->packet_cout != count_copy)6 A) [* f: B" _) U
        {
( }' b' q0 D( Y8 h' h/ ]( w6 K                printf("a is %d\n", pshreRAM->a);. j4 T8 Y& E7 V5 w+ @1 ~7 q+ u% Y
                printf("b is %d\n", pshreRAM->b);
2 n) \1 J$ P9 D7 r+ B, {                printf("count is %d\n", pshreRAM->packet_cout);
$ ~: d* D4 K$ K+ {" a                count_copy = pshreRAM->packet_cout;
; B4 B: Z, H+ C% a5 B2 S4 Y        }$ e9 @+ G; b+ q& b  f/ ^# b+ x
        else* `+ ~0 o$ p  ]1 g( a
        {5 L* Q( x4 Z1 N# h
                printf("No effective message!\n");+ f/ u: x% U: o+ N
        }
% f! I/ q- a2 B% F0 R}
" q( p1 V7 V* ?3 X8 ?8 u" K
3 u1 j; w" d/ y- d# C* K* A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! }' n; n, J9 {: \0 q4 |5 {$ w2 q1 m+ I/ U2 A9 c. ^2 c8 ^
0 B; e) k, ^9 j! i" s. P! @9 P

' ]- |7 O( c/ R3 U: e1 t9 p4 U
3 ^1 L% b+ Q$ L- Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-10 08:15 , Processed in 0.042518 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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