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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 [+ j3 t4 C. h7 k
* D+ T" k  h( K3 T2 j2 uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ B! e5 S+ u) V! [
#include <unistd.h>. s" D) j# h: Z5 d- V8 s
#include <sys/mman.h>8 u* W7 O- {2 s, D
#include <sys/types.h>8 u. p: U- ?, O7 K, A) Q$ a( o  _/ [
#include <fcntl.h>
. V% d3 z1 E1 R" T& q& |0 L2 {, S
' I0 A; m3 b: P& h3 y$ U0 O. q' s#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 d: S6 I2 L, u' ?/ A6 M" {' X3 A, ]- V/ p" d0 p% _" _+ [/ k3 G
typedef struct: _/ i0 Y: |, d9 [- o5 Q4 E
{5 x' M9 m8 k6 r8 w
        unsigned int a;  l  ]5 `( [3 J, c7 C$ @4 }
        unsigned int b;
$ u" ]' W1 J0 p' z' O        unsigned int packet_cout;/ |/ r( ]/ j1 q2 o1 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# _- h9 I$ |( O$ L1 H7 o+ O

2 ?6 O7 K& G" x) Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# [) ^+ i! u5 Y- y( P2 u
unsigned int count_copy = 0;/ L' l+ K& r( \% L6 z8 G8 _3 K
8 V& r3 n! U4 h1 R  J7 r: ~

: q, V0 R/ V3 hint main()
: c6 U/ }* {- n, x+ F% k: o. z{
/ G0 \) L6 d: s# Y1 N        pRX_MSG_PROTOCOL pshreRAM = NULL;5 u/ k9 [' k  g1 x$ G8 m: D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- g1 X! S- g- c! h. n, y( I# S/ ]

5 J9 ~. U6 }( v9 _# e) R2 U/ H; i        while(1)
' r3 p0 i0 Z5 ?* h% v        {+ ^" U& Z: }3 I% {: H0 t
                read_MSG_buffer(pshreRAM);
. [( m, e/ r# e4 A+ I/ d2 e$ E+ x& r        }               
# Q# t2 ]; D( m" @1 Y( p: s* S' _}
4 D3 h- o$ ?- c" P# N8 E
% ?9 e3 d- k& Z& m+ Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( W1 D& |) ]3 _4 g& X, y{% X0 J$ S( H% [0 ^
        RX_MSG_PROTOCOL buf;
- v: [4 g5 a5 r0 b        ! L9 D) f' d0 v" M
        buf.a = pshreRAM->a;
. \1 Z: T2 V; V8 ~' C# B% O; @9 \        buf.b = pshreRAM->b;* p. D4 N# o+ p& s; v
        buf.packet_cout = pshreRAM->packet_cout;
: }2 \1 t7 A" w+ J7 ?  R! B        
% p. F+ k- X! k, F4 t5 k1 ?        if(buf.packet_cout != count_copy)
  }( ?! b2 w+ p) K        {# t* n3 F1 L3 b: N: m1 t8 @
                printf("a is %d\n", buf.a);1 o' V. ?" `9 H
                printf("b is %d\n", buf.b);
/ B7 Q8 K# Y6 x3 ?$ A" w                printf("count is %d\n", buf.packet_cout);- d8 g8 j. K3 @5 H. |1 m. L
                count_copy = buf.packet_cout;. o7 ?# Q  z7 m" S7 @. _8 a
        }5 r# T- w/ f; G! o( p) Z  W
        else& ^6 j6 h. [& y' n/ Z: g2 M
        {3 A# U" a. ~$ N5 Y2 |9 U8 I
                printf("No effective message!");# p$ b0 B3 f. q( q! r
        }
) ^! [+ B' q+ {& g- L5 U! P* J}, W8 ]: v1 M6 r$ B

+ P9 S! z/ a! K* f9 R5 x2 R# G, d0 g4 G- Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) |* _: W: b! T8 T' D4 ]) W
使用下面代码,对内存使用了mmap函数后:- }: n$ @% B% u! ]' D: F
#include <stdio.h>2 T" B' b+ S! z- I5 X" l. b$ D. f, s
#include <unistd.h>
$ P0 A+ `; f1 t+ h# v#include <sys/mman.h>
( [. T: ], Z8 n#include <sys/types.h>& \! a- b; W5 U  p
#include <fcntl.h>
" m* w( h2 K! [) G! e& H( J
5 w9 p( Z1 C* `: ^$ u0 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)
' M1 Z2 F* d6 B% ~8 R- n7 z#define SHAER_RAM_SIZE         (0x20000)   + s$ b7 T# j" R, X2 M1 O

/ J. |* L1 [" @% }% ftypedef struct# F4 X" N: I- I4 O$ m
{( }3 G4 o+ z: N& d
        unsigned int a;
8 n, }4 `9 N: j$ q; n        unsigned int b;
2 C* y% r. }- E, V6 O7 b2 m4 U3 b" C        unsigned int packet_cout;
7 D3 k; A  N" e  ]5 p' h: Z; j7 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ ?' J0 V( v& d3 m3 z2 Q
8 ]# c5 r) Z3 @2 g# Z
void read_MSG_buffer(int *baseaddr);, }$ _$ s& w& f; P" U
unsigned int count_copy = 0;  ^) F6 ]5 P4 d1 J0 {3 o+ T0 a

6 @8 \; k( w7 |int main()
  B) l( d$ x1 ]{2 s% P( S: c7 Y) u. {/ Z9 D7 q: O
        int fd;2 A9 W4 O9 |, }' x0 W' |) U7 x
        int *mem = NULL;
" M6 s+ B8 n) k; D4 a: r. `; O5 ^
* q; i. A1 v  g, N        if((fd = open("/dev/mem", O_RDWR)) <0)' n: y& J3 X; o! t: ]* L4 O
        {. ~* Q& _7 F& ^( a0 S
                perror("open error");
5 ~: ^0 N+ k5 w6 x5 a                return -1;
1 t! ~+ i1 A/ w  `0 l! G* k! n        }
( P; {# h, u" `( S        
6 t! h6 e) P9 x6 R$ y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ `  U2 `, S6 A  A9 F
. x7 X) h7 B' X) t2 p& d4 ?. T
        while(1)3 h0 Q! o3 c5 S! ?8 a
        {( W" O/ O/ z6 p4 T% a
                read_MSG_buffer(mem);
$ ^  N) _; D7 u0 ?% [% U7 i& g        }                ' o6 v& N5 c# s4 O$ ?
}' K: Z( K7 g2 j4 }7 ~

& M" O6 E3 k/ Nvoid read_MSG_buffer(int *baseaddr)0 }  d% U# {/ u( `
{
& ~; }  n1 Q. d" W        pRX_MSG_PROTOCOL pshreRAM = NULL;- w2 o! `: _# J# v# r

. N9 n: q/ l6 \; y1 r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' p  O  K% ^* M7 U" k! ?- \/ [
$ o. x- C0 N) n9 o9 G
        if(pshreRAM->packet_cout != count_copy)
$ K! q+ Z6 s% k/ G$ e9 C5 W1 p        {
2 L: E( T, M; a* v) P! i                printf("a is %d\n", pshreRAM->a);$ |1 g6 L+ d/ @
                printf("b is %d\n", pshreRAM->b);6 r# R: ]& J* G4 `+ r; |
                printf("count is %d\n", pshreRAM->packet_cout);; B5 P( Q; R" Q, A; D" L% \
                count_copy = pshreRAM->packet_cout;
6 W' e' v% P6 O: I7 z& y% b        }
+ i4 G+ z& x9 Z! u; P4 l0 d& Y% @        else
' {0 Y3 t5 |' I+ h, K% e9 D1 m, S' I        {
6 N: O- B+ X6 F! J. R2 `( p                printf("No effective message!\n");
3 i4 T, g2 v. S5 X" }        }7 C# y0 B* L6 I7 {, d' s8 @1 R5 k: \
}# @/ W1 K6 k. V
2 n2 b9 N/ [" \3 N  d5 }. t3 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 ?2 S# I1 z+ p) d$ \

. r- K! t. B. l; `3 `+ v/ {% D6 C$ N
5 g) Q5 J) `1 u! w* S  m7 l6 x$ y% r. V: W! j

6 Z& T0 c9 R0 _3 ]2 \' T: W- l9 H' y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 04:56 , Processed in 0.043180 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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