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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 h2 B) S% K2 l! Y/ d2 x
; E" @3 m& y) Q2 L. l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 x; D. Q* P2 k2 L% t4 L
#include <unistd.h>
3 R8 l% O4 l" X. L7 h1 i4 x9 y. x#include <sys/mman.h>
! H/ T5 V, `/ n+ t#include <sys/types.h># u; X+ q' p/ k, M- ?8 C: I
#include <fcntl.h>( B$ v5 G; A+ w9 m8 ?% _5 f1 Y: n! ^
. E4 V* U/ K7 Z- E% B7 k
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. A/ L: [9 a2 Z( ?* [
8 d" I, P" E5 D8 N) F) p$ jtypedef struct+ {' H. t6 k( G
{
0 I" }7 [! z/ w  R% e+ [* \        unsigned int a;
( p8 m6 @. }# k        unsigned int b;
  D; s9 |# q( C; r7 I  ~9 g) g9 Z* m        unsigned int packet_cout;; z+ w) V. O( J8 M$ Y; Z' k7 p$ H* `' V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) f5 {. `8 ~/ H9 j( D% M1 x( a

. j# t" O+ M& g( z9 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; H: o7 {3 x6 r3 D2 P* [2 u
unsigned int count_copy = 0;
0 X0 E3 o) v2 U+ V  D, W9 d% l& _+ o1 s2 g' D& Z+ q
$ S* o- v9 u' }2 L6 A2 I2 {) Y
int main()6 B, U( I( z0 e; w
{9 S* r3 l/ m2 J8 k% |& u* ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;" k. k& Q1 Y- z+ N. p( B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% s) z% k# r) ^/ Q: A4 |9 P2 X/ O+ n: x& B
        while(1)" Y+ ~# U  k& A
        {1 f9 p) w# t2 y' P9 y6 ^0 }
                read_MSG_buffer(pshreRAM);
9 }. q4 t# \* }  Q5 q9 m% ~( a        }               
2 k- c% J  b; L6 V9 p8 G0 |}6 O0 I; m! @0 b

! }7 K$ P- Y' q2 g% `& t/ O7 Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), l: }6 N9 w- @1 |- s/ L5 L/ B
{3 @% a/ c) T3 W4 v) ^* q3 {( x% {; m! Y
        RX_MSG_PROTOCOL buf;
7 }7 d4 f# v8 Y+ a( F        2 B: S: z' u, d; G# u6 u' U. Y
        buf.a = pshreRAM->a;
1 ^8 N8 I' G9 u- Z0 F) P, K        buf.b = pshreRAM->b;$ o/ i" h- x# j  {2 e; K$ f
        buf.packet_cout = pshreRAM->packet_cout;) n: U  h& i0 w- C  S, C
        8 Z- P5 K+ j* E; O  d% W
        if(buf.packet_cout != count_copy)5 B8 s- N' f! Z$ `+ a
        {3 S$ U/ ?0 r3 v. ?& n4 b( n0 ^
                printf("a is %d\n", buf.a);
; D" l# @# O5 A                printf("b is %d\n", buf.b);
" Z' O7 [  C1 E; Q5 S, ~* T  J/ u. q* x                printf("count is %d\n", buf.packet_cout);
, d  ?2 P" [5 T+ K) Q                count_copy = buf.packet_cout;
$ X% w# A  d8 _" O' l1 _        }2 t8 D# y% R. I- F; r% M
        else
3 @+ }6 |3 o. Q$ U        {
7 s+ @/ m9 L# F" e  \% l                printf("No effective message!");
! n! U3 Z6 U6 O" B! N        }
3 S' _/ |5 a  e, m* h* |. {}1 M* t* N6 X9 d- R. s2 a) G  a/ C

' Q2 y+ T7 ]' U, o* q7 H. F
  @& r9 w  g2 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ D6 d. U( s! x; F) ^2 O: X
使用下面代码,对内存使用了mmap函数后:
( f& h! Q  M% a+ J5 D#include <stdio.h>
! ~3 T  y# m) \+ g#include <unistd.h>
9 k7 _) q4 a& a$ X#include <sys/mman.h>
% H& H0 r, A( |& `+ }#include <sys/types.h>
$ p0 V& D( `3 @/ `! E; g' }#include <fcntl.h>
9 d! T( u/ [9 `- c+ f0 x
* s) j! ^" q4 L3 Z* G5 G9 z$ }2 C: \#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ ]1 w% O6 Y# F- F1 ]! o3 T#define SHAER_RAM_SIZE         (0x20000)   # O6 H8 Z) ~/ j: F
  d2 [$ D# n/ K
typedef struct
( U: c+ b4 R7 X{1 }. {& b3 ?! D# {1 f
        unsigned int a;; ]! q3 w% M+ Q& N# j# i$ \
        unsigned int b;
# ?+ l4 ?2 E- i3 n4 [        unsigned int packet_cout;: E3 q  [: W7 a# ^/ B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ a" i" k3 a2 I: N
4 l: {! x6 y4 y$ E8 D8 D* g* Tvoid read_MSG_buffer(int *baseaddr);
) M8 e5 ]6 J+ w8 l. q6 y5 w6 }5 x( D' aunsigned int count_copy = 0;
# ]/ ^3 z1 ~9 t- W$ m/ I$ l, T: @( S2 H0 Z+ Y3 s
int main()
- ]; g9 q( n& g, \" H% {{! L: O3 h% h0 W5 E: ^$ @
        int fd;$ T6 O4 L( J6 B9 i+ s
        int *mem = NULL;' }8 V& A0 h: S2 t. c+ r# T

# P2 S1 `) w3 c0 h; G7 z- A        if((fd = open("/dev/mem", O_RDWR)) <0)
6 |# u% z$ k1 I/ K8 A$ \- v; b& |        {
! Z3 u& q: J( m( Q                perror("open error");
$ L" |4 P7 E+ Z( G; l                return -1;- ~, Q. l' u* |: A3 q0 F
        }9 `, Y9 ?0 [% p: p7 G
        
4 |* r" J: u7 ~+ e: P7 H) p0 S        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 o6 y3 G  i" ~: |2 B4 s

% V5 ?/ G9 @6 r" @! X        while(1)' r: f1 h6 J& Z* k
        {, B! [9 p+ [! g) c3 N5 z8 T
                read_MSG_buffer(mem);
9 E9 H* t. l& {+ F+ V        }               
: L3 D- Q; Y' t5 f+ s* ?3 Y1 {& N4 N}- u: W$ s4 f0 G8 H7 {; ~, P

, @& Y1 H; r) B9 n+ ovoid read_MSG_buffer(int *baseaddr)- D4 \* j3 D3 {( w/ h* P3 F
{
+ w, {/ G: ~# v8 h        pRX_MSG_PROTOCOL pshreRAM = NULL;9 m8 ^. T; o9 z/ D
! f: \6 v# d! O8 o- C
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 ?8 w" p, w! D. C+ _9 v

3 m- t6 m0 Q  U+ l2 t8 ?  f  [+ s        if(pshreRAM->packet_cout != count_copy)5 a! l5 p& F$ D" j$ r
        {
: K; `1 n( U" I                printf("a is %d\n", pshreRAM->a);6 v/ U0 d% ^( k6 p, j
                printf("b is %d\n", pshreRAM->b);9 |$ M8 C9 q0 x) S8 R2 u2 n
                printf("count is %d\n", pshreRAM->packet_cout);
) _) @% H1 C, C$ \: I& m                count_copy = pshreRAM->packet_cout;
2 p0 {9 O+ ~+ a& P3 y        }
' L* b) z8 Q( ]; g. S4 C" |. x        else
2 h% E+ Z& {* j* h; X        {6 m+ b: o9 B" R3 h
                printf("No effective message!\n");1 K4 A! _5 j' {" d. G5 u3 `
        }
: c0 r" P6 L! d' t  B}6 m% Z2 {* S& S0 M$ _+ `: X

0 P/ w. b) B& z$ s: d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# I3 r5 f5 W- d1 ?0 L; z
" c4 q( F& k. V/ G3 R! _

' V. M; L6 }# a$ t# m1 g( [( K1 ?% |, a& C- _0 [) x

- l3 H' I& y9 V% Y5 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-22 04:59 , Processed in 0.041279 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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