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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' e5 e' u$ a3 k, l
5 L( G8 o; ?$ fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 a" }  ^3 H, ]  a$ I% Z# B7 b#include <unistd.h>
" x0 u, G# {4 A. W0 J' z#include <sys/mman.h>% [# i- Y8 k' C5 C8 {7 Z/ a2 t
#include <sys/types.h>
' h+ ^2 z  F8 n7 P+ D' `#include <fcntl.h>0 L- M- H0 y) K- R: m, b

6 V" t% I  B) t( z2 d#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 I. g  b6 \, w
. j" n- X' f6 m& v6 T
typedef struct$ t! ^; M5 p: s1 L
{/ D- l% J- |3 V1 M- p4 i1 z4 m4 a
        unsigned int a;! ~* q: W, O( x$ }5 L3 r
        unsigned int b;* Y8 j+ H2 \7 {) K) U
        unsigned int packet_cout;
% h4 ^  `. @. B- l. j! h2 t/ @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( T, ^+ N5 A  c; ^

3 p+ y$ n, n5 V+ u0 k% T) l: rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 O' ^# Q+ i! w# w- Hunsigned int count_copy = 0;1 U, r2 N3 a( ]6 \1 e. a
& V- l! Y* s3 z; x
1 M. `6 ]( ^5 V( L) p; x
int main()
% y/ g8 \; \' I{
9 U' R+ z: e; V5 _) \4 m        pRX_MSG_PROTOCOL pshreRAM = NULL;
# c1 K% s3 S% z! b; o  `' ?        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' e4 O; H; }2 u  U" T
- D; t3 I! F  r) w! |, L* N, @" \        while(1). ?. N0 G5 B, V+ z, f+ ~, ]
        {
, w; u/ {/ [! X/ w7 a4 {; r: Y                read_MSG_buffer(pshreRAM);
8 J/ G! V: W) c/ {        }               
0 u, r6 S. w3 Z}2 ^2 W. E. p* y% M2 {  c

* c9 m( x& r- {! D6 n( d1 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 l. w; {$ d* A- y: [7 Y{, x# O  ^6 S$ N2 H; f6 r7 `
        RX_MSG_PROTOCOL buf;
5 w( Q! u; B3 t. x: @# t        
  o- [* [$ T: l$ @  Y3 T1 I        buf.a = pshreRAM->a;
. S) X8 p1 n) w$ _' s) W        buf.b = pshreRAM->b;
" H- d+ j" ^3 r: Q' S" c8 M        buf.packet_cout = pshreRAM->packet_cout;
' O9 M! e3 g6 M, a- `/ b, \! ^  f        
* c& u: z6 o" c; K+ d        if(buf.packet_cout != count_copy). A2 y1 W  M* m5 e
        {& O6 F0 N1 n7 K7 w) y
                printf("a is %d\n", buf.a);- _: a1 Q$ R* h5 |( F
                printf("b is %d\n", buf.b);. c; z% n$ e6 n. z5 U
                printf("count is %d\n", buf.packet_cout);
9 W2 r" [6 F9 A$ Z1 d                count_copy = buf.packet_cout;
6 t- h7 U) K- C$ \; q        }% [( e. b$ S9 B* U' q
        else
7 ^! @5 q: b- ^; ^/ g. C        {" W* k' }+ y% a+ S8 l' {3 w4 Y( d
                printf("No effective message!");4 `) V% B* P7 @- I! x( i
        }
: q6 z2 Z0 D' N}/ q( U8 W" [2 O6 E4 Z* I: h) |3 f* @
) v& W3 f+ b, V# `9 d
/ X$ d+ A8 `: _& Z) ^( c9 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ \' y1 S, o+ X3 M& ^使用下面代码,对内存使用了mmap函数后:
7 s7 Q2 v4 d2 V#include <stdio.h>" ^% u* [7 I: p5 j% S! D
#include <unistd.h>( V% i" \* N$ S; T. A. P
#include <sys/mman.h>
8 v) d. |/ q, y5 }; J* i#include <sys/types.h>
/ Q3 Z- i# C( ~0 a- `! ^- d* E#include <fcntl.h># q8 ~0 M. y. L9 L$ a0 K6 X, `  _
% R8 J& R, c" u: G. {. R( `
#define SHAER_RAM_BASE_ADDR    (0x80000000)% o; V7 s; _9 C1 h7 |# t
#define SHAER_RAM_SIZE         (0x20000)   
3 S8 i5 c5 l# y! @4 G
2 M% p( [% H+ htypedef struct
$ w( M  T- Q* G{
; u# ~9 _0 O2 \* W3 |        unsigned int a;, [% }6 Q8 N7 n+ E% l9 H+ g+ a
        unsigned int b;
. d. h9 k+ a% h3 ?0 U& K/ z        unsigned int packet_cout;
& i: P4 P: F& X4 a# n5 g1 C! b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 M) {* K% l; T2 R1 d% y& ?9 h

4 x; E3 X! z! m& Y/ t) Nvoid read_MSG_buffer(int *baseaddr);* D; ]+ g* \6 Q( ?; y# X. R4 T
unsigned int count_copy = 0;/ S& w9 j8 B1 T* K

( }3 ?2 B- p8 L; y5 a4 Dint main()
% x  H5 H2 f, ^0 y+ j{; a9 s2 u( n( x
        int fd;
  f1 N4 d0 K, s; q& P        int *mem = NULL;
& ]  l% H4 i; q& ]( d; q
+ X, U7 U/ z9 c" y& X4 j        if((fd = open("/dev/mem", O_RDWR)) <0)
5 n; x" Y0 Q4 M% ?        {
; I" v3 Z8 y- m& @1 O                perror("open error");
3 n9 i) a3 Q0 d: |  x4 @                return -1;* E7 Y: s( ~2 k/ D, Q; Q/ C8 w
        }
% ~2 a( X4 W) D! K8 q        
1 n4 O$ I# w2 k+ d% O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 q( i) V! R/ }
2 C3 @7 ^9 i6 s0 P7 E
        while(1)
# P2 W7 V$ n0 Z, g. V        {0 C! ^* V  y  o) ?& L& P$ E) f( b
                read_MSG_buffer(mem);
! h0 Y5 o0 E+ J3 y        }               
$ I( e: t3 v# j* \2 S/ }7 {: W}
& A$ q9 I% O4 R
1 H! y9 r) M; Q3 q# [8 ]7 ~& q) }void read_MSG_buffer(int *baseaddr)1 }0 h1 {# V1 r- H; F# j5 w; Q: L
{/ {" x7 c5 Y) Y! h1 a" l  [- V
        pRX_MSG_PROTOCOL pshreRAM = NULL;* i, y$ V9 Y. V- F- L

+ Y  t. Z. M' e& `' _: o: S& J        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 W- J/ x+ S6 B
$ c3 w" D. t( P0 e        if(pshreRAM->packet_cout != count_copy)! [; ^8 S$ D/ X: H! K. S
        {
; o. R8 l  ^# H5 z( ?                printf("a is %d\n", pshreRAM->a);/ A8 I' d; K% d& Q2 \2 m  _
                printf("b is %d\n", pshreRAM->b);
: `! `$ _2 q# A7 L$ J: V. ?                printf("count is %d\n", pshreRAM->packet_cout);
6 n" V2 @- p5 N! l6 w                count_copy = pshreRAM->packet_cout;
2 o1 ~% v0 {! E9 x% u" w/ ^        }. n* S1 Q8 G6 k
        else- ]. [/ u0 {6 w/ R# @! ?7 X
        {
  {3 ?: X5 P& r# x                printf("No effective message!\n");
- Z8 X  ~" C# f7 j0 x) h, h        }5 l* f0 K$ A* `5 O/ h
}: l; z1 a+ B7 j# n8 T

8 V- w) `( m6 u8 Q' @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( p: T' e7 A: ~( H( p
1 R* H9 n( p+ x% Z- a7 E+ M# [

, W+ O' a' H$ @- K
% Q4 @. n# H) O8 x) M5 H2 s, `1 {- V  N4 M% u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 05:17 , Processed in 0.037182 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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