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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% E" M1 i$ [, s% B8 z. Y' }3 X, ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 D& c- t7 \& g, I: n! J6 P
#include <unistd.h>
6 A+ \; y1 v. G! w0 K#include <sys/mman.h>! L" \8 N7 l1 [, L0 E" n* l' j
#include <sys/types.h>0 G* `9 l$ ^5 [& T7 b9 |. g$ Z
#include <fcntl.h>
- [( N- a  D) L- A) E  j/ t+ h' v  J( _1 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 l4 g2 N; i! e& |  i; c7 _, H" V! C. D2 X5 Y* H
typedef struct  S$ }5 _. Z7 x
{
8 Y, |$ v& A* c+ C0 s        unsigned int a;
- ]7 l& J2 m' n4 f        unsigned int b;# W8 I5 C( \1 J* v* o
        unsigned int packet_cout;' M1 ?9 c2 ^6 [7 }5 K7 A. H  d1 K" o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ]- N) U: x$ C; J% Z& Q3 I, }' g( q7 A* \+ f  Y3 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 F8 T' p# S3 L9 s
unsigned int count_copy = 0;, Q+ e/ B& x- F0 n

1 _* {' v& g' k" O3 r5 @1 i3 Y8 L
( T2 Q/ ^( n' {* t1 Hint main()% E( p% h0 F# Y6 B* F
{
4 `# @. p$ u2 n        pRX_MSG_PROTOCOL pshreRAM = NULL;* z/ r. X, {* @% ^& d$ T
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' Y- |8 e7 w6 f, _  m% Q# [
. Z  [% v% e' B$ `  t- c/ Y
        while(1)- s% X, m& D2 o2 O# ^
        {
, s$ |" O) E# l) j                read_MSG_buffer(pshreRAM);7 O: p) \7 L% \4 J2 H' N! V7 s
        }               
1 N& h: Z1 G6 o}
3 P" U# a4 y: `8 h( n: e4 l' r
7 f# f1 z0 ?9 f/ |% X% G1 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( o8 q, z: _; i6 r$ Z
{2 R9 k. q+ L( _0 D) Q4 P
        RX_MSG_PROTOCOL buf;
! s8 c0 X* k( n1 p8 j  Z0 j        
, N. c, O2 U5 Q& E7 Y        buf.a = pshreRAM->a;
6 B. E  z7 @- o% C! \        buf.b = pshreRAM->b;4 o# F6 I& |( Z9 t! u; d
        buf.packet_cout = pshreRAM->packet_cout;# Z9 C, w* A! U* Z$ J0 L! n9 z6 P
        
3 a3 e0 {; N8 G; l        if(buf.packet_cout != count_copy)
! P. n& O/ |# Y$ E% R8 C        {
( a4 ]! }& z  m# j                printf("a is %d\n", buf.a);
. r5 _" r7 r& l% S& B& l                printf("b is %d\n", buf.b);
# _; f% J3 R. j: O2 v; |                printf("count is %d\n", buf.packet_cout);) t! Q& o; l2 n$ u9 K
                count_copy = buf.packet_cout;
3 c6 o7 e3 Z: z. c+ W( }        }3 a) u. \* ~6 c: D
        else
  C' {! J# S8 \: t. [1 @        {
2 u# k( r0 ]4 b; z( O0 e" q                printf("No effective message!");
6 t9 \" D$ c! I/ n        }& U1 ^: S6 Y3 H4 N& {7 `
}
$ w- l1 X* r* r$ b
! ~# s( P) B% G9 D6 F4 D3 X; _6 S/ A# Z$ _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! U; B; @3 d2 p% U+ k! X; F
使用下面代码,对内存使用了mmap函数后:
' }+ H" {" u2 L2 R+ m#include <stdio.h># H+ h+ A) @- X  x* ]% G* E8 M  s
#include <unistd.h>
- x3 R; I0 R, J* k9 M7 `1 X#include <sys/mman.h>
# B/ G7 d5 R5 v' \#include <sys/types.h>
! u* N, `8 V7 F6 u$ Z9 x% @#include <fcntl.h>
  U: C9 R( A: I
8 |: T# r0 W0 Z; X#define SHAER_RAM_BASE_ADDR    (0x80000000)/ k" A$ k0 M/ N  L6 k
#define SHAER_RAM_SIZE         (0x20000)   . T: A8 G0 Y/ F" {6 i

/ w/ \$ y# J/ X) c1 n6 i2 \typedef struct
, u' r( {" _; O; Q% i5 j2 I2 _) ?{: }( I* B( `+ }# `; n7 w" \
        unsigned int a;
  ?+ D) S' @9 ?$ v        unsigned int b;, B: I4 o0 b7 q* K- O1 L  ?, w
        unsigned int packet_cout;3 t+ r* i/ L* o4 p& ]& v  d  _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 q/ T3 m. {& P5 }' d8 |9 @8 Q; o6 ]/ ]5 q: X6 L# _: U
void read_MSG_buffer(int *baseaddr);
4 r. |# Q! b% y  x9 Dunsigned int count_copy = 0;# s& s4 C4 \  X; ^5 v

& F: W& q& t0 p! w8 m, `int main()
+ r  H2 \" O7 K! {{
/ m. b8 u7 M' y4 ~        int fd;
& k6 x: u# v6 X% r3 k, c6 ?        int *mem = NULL;
$ r+ g; V& P' y. N- r5 z4 n# {1 u# _8 r% e/ k/ h
        if((fd = open("/dev/mem", O_RDWR)) <0)
- g3 A) ~- B# V3 {        {* l- w$ E- C: c/ F
                perror("open error");
* b3 N$ f! |( w                return -1;* s+ Q% r5 O7 J" C3 d  t
        }$ {) P5 k/ e2 a4 l$ I% t
        
: [* ^$ @0 E+ @/ q' q# d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. W  Z5 M* l1 ~$ ^
) Q2 R3 e, v3 X& @% T. j        while(1)2 k- s% i1 P8 V( ?: S9 M: Q3 e: H
        {& `- {9 h) B' w  y
                read_MSG_buffer(mem);9 T6 m' ]; K1 s. v# l) V5 c
        }               
& ?$ l+ A1 e$ i, m! @( }+ u: D, `}
: }$ U2 m0 @2 G# o. v7 N5 a" a: l
void read_MSG_buffer(int *baseaddr), S8 ?- N& u; g6 S) ]- u
{$ O, H: z$ F; Z5 ^, \7 y3 H1 a# S
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ `4 K* t" @. t) M5 R4 o2 w, s
8 x0 P- u1 ^/ M2 ^9 V1 g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* I4 H: Q- v; o8 N1 G. J# o) ^( ]/ l+ d& o- N# D2 O5 M
        if(pshreRAM->packet_cout != count_copy)0 }+ `- u% ^1 y4 \
        {" n: ?7 }4 T  H
                printf("a is %d\n", pshreRAM->a);$ C  j% f% `5 o
                printf("b is %d\n", pshreRAM->b);
: l6 G& F  Y( W3 B+ e& B                printf("count is %d\n", pshreRAM->packet_cout);% N7 X+ Y9 O6 b7 Z, S5 W& P
                count_copy = pshreRAM->packet_cout;5 W7 K4 E4 _0 ~' v/ X: [
        }
  V2 L) N  `0 ]" R        else  @5 E2 E, A& K" e( _$ h$ V5 T. E
        {
# L# ]* I, Z: @                printf("No effective message!\n");
" l9 |( Y( L" V' T) k0 Y        }) q% V9 [3 P) I
}4 N" N& _, v# t

3 R1 B7 ?; T7 z) m( @) |2 z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 c- t9 [# [0 s! J- O$ ^* p' Q& B8 {9 [: X2 z

0 ], w5 [- u. C$ p2 c! ?
5 k) F( R  P. e) `2 f. j0 v6 `( T  F6 U: C  S* r/ X& k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 14:25 , Processed in 0.039470 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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