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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Z$ C/ A0 r' ~3 K% c& c# |- z4 v8 r3 e& u9 e$ [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 V8 I# Z3 h: f! P#include <unistd.h>
5 q. Q7 N" ]3 W2 s% X  ~#include <sys/mman.h>) S$ `. T* g9 _( h5 z% O; [& V' p, A
#include <sys/types.h>
" u5 P) \' x" K! A- z#include <fcntl.h>
% ]$ M/ |% |6 _) A* }$ l: Q% F. y$ I  @. G0 A/ f; v& o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   + M& `. u8 S, t" d3 U' a

: l7 g: Q# ?# R5 [2 \' j5 m/ R# Dtypedef struct
: h4 K7 o1 U$ [% F9 |8 {2 o{9 k& J2 \6 G2 c! I2 E- G
        unsigned int a;
4 r7 Y# ~' h, w0 Y        unsigned int b;4 G; z2 m" S& ?
        unsigned int packet_cout;0 m. X3 A; @$ r( W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: t& _6 L5 c, G  A( \% r) Y* G% L+ Y! F- q) d' ?+ W& t0 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 q3 m( x9 M6 @) S2 P3 o
unsigned int count_copy = 0;0 J. E: |( W4 e! M" X1 j$ }8 ^7 F  [

# p/ j, x5 X9 J$ [; l/ q4 x' n0 ?8 I% K2 h( K2 l
int main()1 L. j& H% M0 A; j" p
{
& _2 S1 I( L7 a& q# |        pRX_MSG_PROTOCOL pshreRAM = NULL;* O. d. O* t& \; T& @  p$ [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 h# ?3 Y6 v4 c+ m# p5 M  z( }
        while(1)
; A; ^7 u7 ?2 g0 O0 _        {
! Z; q. `. C5 p; ~7 S% Z                read_MSG_buffer(pshreRAM);- I" I* t8 H9 k+ l) L
        }               
9 x! H! x4 W: y" h: D" j, {, b}1 s, Z( x0 U7 y* q
- C! S$ {6 i6 J$ T1 J, M0 d% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! G& S% z' p$ g6 ]
{
/ \$ X8 Q! P$ ^$ _, B        RX_MSG_PROTOCOL buf;7 N. l2 s# l( N$ C" ~
        0 l8 R7 ], c. P  L
        buf.a = pshreRAM->a;
9 G$ \. A% A' j  J        buf.b = pshreRAM->b;9 `% A- A, j# k- ]  Z! j
        buf.packet_cout = pshreRAM->packet_cout;
6 P* |) T9 o* S0 y: U4 o$ H        
4 o$ I8 m7 O" ~$ }' |6 i        if(buf.packet_cout != count_copy). a1 I+ i4 k! d& K8 i; o, E
        {9 }6 i: O5 X4 p
                printf("a is %d\n", buf.a);! ]1 A" x( L+ P9 K4 a  |
                printf("b is %d\n", buf.b);
( O0 ]6 c; e8 f1 E: A7 h: B( j                printf("count is %d\n", buf.packet_cout);9 o# k& t4 @! a  S% I8 x) v
                count_copy = buf.packet_cout;) n6 _4 Y4 W: M, `! M7 v" w
        }% Q  @$ c$ \) _. I
        else
, W7 x/ i1 r# T/ O) ?, v+ _        {
& |: k8 k, P# a. s4 K! \& A                printf("No effective message!");3 D2 `: u' `& M" U* p$ }2 ]5 |
        }
, m) g4 f) s: P/ h# c  f; b1 _, a}
1 `/ u/ V  ]8 l1 f
0 k% j: m& S$ e) T7 ?1 p9 k3 d' n) w: [. z# X" i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- R$ u0 B, H( g7 G) Z
使用下面代码,对内存使用了mmap函数后:
0 ?& Q* \  G0 \! |8 v0 s4 `#include <stdio.h>& }$ O& b4 i( ], \, e2 q$ ~
#include <unistd.h>8 [. W' ?! r4 M5 `5 w
#include <sys/mman.h>
* Y% o9 p# S& K( k( w$ S#include <sys/types.h>1 d4 k+ d& ^# X) m* `- \/ `) a
#include <fcntl.h>
( p  A8 S# W' `# T- g! ~' H- E3 z3 v% Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)  M1 o( l& U3 |
#define SHAER_RAM_SIZE         (0x20000)   
3 S  W6 {- t8 e. N- u, d- C8 {8 e5 `
typedef struct
( ?. G0 ]+ h9 J{4 U" E2 ~& f$ |5 p7 x
        unsigned int a;! k% @5 M1 t* m: ]
        unsigned int b;0 L/ f* D- @; J+ f1 W9 N5 K! i5 D& K
        unsigned int packet_cout;% R  F4 a6 a5 i" n( w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 a7 k  t! _/ n  t- R& z# E. J9 }
2 t) G9 D2 t! Q, N) |7 W1 F: X+ d
void read_MSG_buffer(int *baseaddr);
7 W6 a6 n2 G! K7 Punsigned int count_copy = 0;# ^4 [& t" a/ I  H4 P) u

' L# B$ u$ L; o2 Kint main()0 u8 ?. g) j+ ]; @7 T9 _( O$ _( A
{0 Y  P0 P4 F* f: i$ ]6 Y
        int fd;
/ w4 _7 E( S2 t        int *mem = NULL;3 ^" b8 b' W0 a2 h% b! Y- b/ k

* |% ~' B$ U% X7 ?5 X        if((fd = open("/dev/mem", O_RDWR)) <0)
. N4 N: c* ~9 d! m; r- m        {
# E0 o5 ?* h1 b$ Y, k0 g                perror("open error");
% |% h, L2 W( N1 ~+ \7 ]/ l) e! d3 u                return -1;* o, |/ [! G" x2 G- r" v
        }
0 a# J* ]! H4 d& m( j          ^3 ~  N5 A) O7 T) R9 F* p5 F! S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 D2 s5 q6 k5 W9 g/ k7 g+ Y
- [( Y7 l: i& O( w        while(1)& n& H& u& c, L) h) b
        {
6 c* U9 N0 W3 C5 z$ X0 h                read_MSG_buffer(mem);
! q/ q' e7 N* N8 G        }               
0 n" q. l. V$ L+ ?. y2 l}
( I- P0 s, \; Z5 j; }1 v5 w
) p" q6 N, x2 M. j1 i- ?void read_MSG_buffer(int *baseaddr). N  a/ H. H, s+ q7 I+ D+ G
{9 U6 b  D7 r1 e9 ~3 @: Y7 [2 q
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 a5 a7 k( _+ B& C
, {1 a5 f2 @$ J2 {; v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. q9 e. \$ q. L0 b* g- c  Q; @0 {- w! X8 ~6 I9 T4 u
        if(pshreRAM->packet_cout != count_copy)
9 ?  P/ ~9 f# Y8 f, r  G        {6 Q  C7 r- ~4 t3 ^
                printf("a is %d\n", pshreRAM->a);( X9 H# I* d: ]1 f; |2 {! |
                printf("b is %d\n", pshreRAM->b);
* N3 H, P- i& Q; v3 E. b                printf("count is %d\n", pshreRAM->packet_cout);7 j0 j" G: i- u
                count_copy = pshreRAM->packet_cout;
! o  A1 S, E2 g. K) T- K        }5 I4 j, u; Q, Y9 w+ T4 N: R+ H) W
        else; o7 l$ ^0 |9 F' [  G
        {
: N- m5 j9 A! Q  v                printf("No effective message!\n");
9 Z# I# l' N( T& Y: H        }/ C, N0 ?- M  B' l/ T" Y% b9 V2 |
}( V7 ^+ @( H0 l3 r
, t: `" S' h# E, d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 g$ U* F+ a* p5 R' a% r) ]

" I& [+ @) {  `$ r) ?! v( v% B) r- S! U
. i: x7 K5 t7 Q! g5 D

2 o) i1 w& ]$ c7 ]$ s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 01:54 , Processed in 0.041295 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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