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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 I, U. T& b/ ?' i
  R+ q' W9 q8 e& g* s! E' ~3 ~% `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 x* Y. X0 z* `& I
#include <unistd.h>$ b# Z0 P8 U6 c+ u
#include <sys/mman.h>; J5 S# S0 D: H" J, R
#include <sys/types.h>( s$ N1 R9 J1 N- w& b+ S; r
#include <fcntl.h>) `. m' z5 I: a) ~+ P  ~
0 C: i; d; W: U- Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* o+ t% p- e1 }6 o6 E, L8 d9 _; M- m% H1 I8 O! z* T
typedef struct
+ P8 e3 _% }6 Z1 B" R{! o6 h, ?/ j& A8 p; B! W
        unsigned int a;
+ p% O# J% I6 c0 ~3 q: d* _% Q        unsigned int b;
( Z% Y* W) Q( f5 `, ]2 [3 u        unsigned int packet_cout;
9 [& P5 m8 f1 K9 c3 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. y4 ]) [' T) B2 O! t& _3 {

9 K# I: T& C& Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 Y$ c* Y$ E$ ^! X) {' l1 X2 _* J
unsigned int count_copy = 0;
: \# h0 m4 ]$ t0 J* R% m/ s
0 f* i3 z; x" M; R9 E' x" ^# K; u+ ?( V2 A6 v9 n5 o# B+ g
int main()4 ?" J2 u5 Q# s1 q+ q# J! B
{
5 p- z: A2 ^& p7 [        pRX_MSG_PROTOCOL pshreRAM = NULL;2 e6 F# y6 y- C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& o2 E! `& p5 m( j: z8 J" B

! N( I" E! F! h" e; x  V4 G        while(1)
) M& }  h5 C* p. n9 _! c        {
6 |( C, Q5 P3 [                read_MSG_buffer(pshreRAM);& |, `+ `( `2 k) e
        }               
' X7 V/ }4 k; y) t" D0 `$ C/ k! o}1 k" R; l, r" o- O+ E
0 E7 _2 _: l" N& J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: n: b0 [' m# U1 ^5 m% s{
# _( {- j) i4 J4 f' r        RX_MSG_PROTOCOL buf;
! E+ m' [& d7 v2 g) H3 E* P% h        8 `' K, ]/ o/ Z
        buf.a = pshreRAM->a;; d: b- v6 d6 d% D5 x' w
        buf.b = pshreRAM->b;/ i1 a6 o0 ~1 P6 |7 b/ k
        buf.packet_cout = pshreRAM->packet_cout;0 l" \' W! }" @, F4 t7 i, b& y
        
$ x  i: _  X; C% e4 R8 Z        if(buf.packet_cout != count_copy)& o. {. w7 j, h$ A) ]- M
        {
; D. F/ @  P+ L7 T                printf("a is %d\n", buf.a);
' j6 }' D/ S; G& ?& Y                printf("b is %d\n", buf.b);3 I8 C1 |- W& P; t$ `9 P
                printf("count is %d\n", buf.packet_cout);
3 S; F9 f  f$ e3 h                count_copy = buf.packet_cout;: Y0 G, s" S7 M& U7 G
        }2 |9 Y) F" _8 x# G/ h; K& s+ p
        else" N; i! J/ S' f
        {
( i& ^" V  s! }2 j                printf("No effective message!");" [/ M& N# E  V' K, Z
        }
+ s0 J5 ~" {% @3 ^1 N; z$ u# m}( d  F4 O) B9 Q/ ?

) n" ^7 N6 }% c  R  o5 w: t( o1 B5 l$ n/ I2 u$ T- p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  [4 U) e& N6 @. S/ _, R6 v使用下面代码,对内存使用了mmap函数后:2 e6 v8 R: O* U! Q
#include <stdio.h>
/ M/ P* I7 Q! N; ^0 n. G; D#include <unistd.h>' [8 `4 w% @+ @2 C" L/ T; H: C! t6 C
#include <sys/mman.h>/ P2 D9 N% o  T! h; D0 J
#include <sys/types.h>" b6 U& c& N8 E: j
#include <fcntl.h>
! S' o/ U9 {( y
  P% M9 ?  _9 m+ i3 y) b#define SHAER_RAM_BASE_ADDR    (0x80000000)
: \* J8 D0 a% b- n) x+ V+ i#define SHAER_RAM_SIZE         (0x20000)   
& P4 q! L7 q! U3 p, b( l1 T3 B" A! Z7 b. M# G0 R/ \
typedef struct6 m5 u6 p3 M3 N& C* `1 h
{. U5 K9 q0 f; {0 x# I  Z/ ]5 y/ m
        unsigned int a;
7 C  S. o- ?& x1 {! P        unsigned int b;
8 N- D9 i) ?. `; C- }- _        unsigned int packet_cout;# o7 x6 Q+ C4 ^, V) Y$ r3 |8 q$ j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% v6 _5 R$ _' M. F! }0 l) Q/ y; n+ }$ V
void read_MSG_buffer(int *baseaddr);9 b' M1 j8 B1 _! U% N" K# J
unsigned int count_copy = 0;4 J& {. K9 h6 _, B; k

8 e  g, ~  A  j4 mint main()
, S7 U. @$ y# D& O5 ~' }$ {{
& j4 Y$ i& @1 J" ?2 S        int fd;4 s$ T' c4 R' J/ s  Y' t
        int *mem = NULL;1 `; I; n4 I2 A! C* C) y8 r+ m

* D5 a) c6 }/ N  c        if((fd = open("/dev/mem", O_RDWR)) <0)1 y  R- n8 n6 _5 U0 Y  Z  Z" e
        {
# e) D! V+ o& m5 h, n9 A                perror("open error");
# G8 ?& k3 I; S. @: H                return -1;
! x+ `7 Z9 Q0 R5 d7 W        }
8 ?% l5 Y9 G2 a        * ]* h( F( @( [; U) S2 Q  ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 B; a3 \6 G& P" s
: t% [" h  F( B2 p9 Y* Z6 H
        while(1)7 y* W9 \! q0 g3 b; }) C
        {3 q  w& r9 ~1 _" o5 I/ g* ~6 N
                read_MSG_buffer(mem);
7 {* W, ?) t) Z& K9 p6 P        }               
/ v$ X/ F: _0 }8 |" ?0 R( l}
# v& g1 O& P- d2 l+ x. m
" K( Q, U) N  k) h) m7 yvoid read_MSG_buffer(int *baseaddr)- n5 v+ S. G& E
{3 u5 c( D/ u6 z( q
        pRX_MSG_PROTOCOL pshreRAM = NULL;! X: _3 R  ?* r6 q% X0 W+ N3 R; C
/ W) _8 q- q% ^9 H" N# b
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- z, N* a' z4 b* T+ S
' s! Q* c; p/ w% t( Y$ j+ G        if(pshreRAM->packet_cout != count_copy)! G! T3 n7 s  y0 j& ~% ^4 v% l
        {
. P5 m% C& L: ^9 w( {                printf("a is %d\n", pshreRAM->a);. E" ~! q/ |& j
                printf("b is %d\n", pshreRAM->b);
- a1 L3 w* T- d; @. S: O& ?* `                printf("count is %d\n", pshreRAM->packet_cout);
9 e2 }( i9 q  Y0 _  Y$ h2 ?                count_copy = pshreRAM->packet_cout;4 `1 o4 o1 B& ]
        }; q* x, g" R9 X7 k3 M7 i
        else0 o& w$ X% Y- u$ S
        {: C0 s5 k; H" V
                printf("No effective message!\n");' i' O7 {' E& l. l( ^3 Y% k
        }2 @$ q; e8 {( P1 M; H# q7 |3 I
}
5 O% B# t/ i8 s, @7 j* @5 `8 {
# c+ \, W- ^$ C) {9 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( N0 T* w5 k) \+ [$ c5 b4 K

% T$ d9 |& l% B) E1 c9 Q+ C7 |6 m+ d* {+ Z9 ?, \: n# Z! M
: {" t/ [- T+ O/ o+ E

" B' U/ l9 p7 g! g; ?# p0 ]) f8 c; u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 23:45 , Processed in 0.037431 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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