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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; e- w0 `1 v- O3 P
* F1 X4 o4 I, v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 d( _9 u3 K) e1 u* l5 V
#include <unistd.h>) ^) [, z8 e) k! o. T
#include <sys/mman.h>* M* {- B/ ^. J7 v7 D  b4 m
#include <sys/types.h>
" P: V3 K& p' u$ W#include <fcntl.h>% \  L1 @* e& k2 ?
! t! h2 E3 j/ R/ G# E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 n, f# B1 A3 t9 O
) l9 d. x9 F+ g4 ^: E
typedef struct
; v$ ^) E+ y' [) w/ T{
' G' t5 z& g7 i% `' a& j0 d        unsigned int a;
0 _) Y  A/ g4 f! Y+ i# w) Z) I- e        unsigned int b;* W* O0 ]# H, _/ u
        unsigned int packet_cout;
" p! M) |* z; `+ u3 b! B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) l" S4 _% @1 r* h5 _+ _$ q. w% e: o  ~4 I9 g) }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 y5 ~& `( |0 J# O; g
unsigned int count_copy = 0;* H7 w) X/ g3 E" ^
# o  s( V0 F$ F- [
) v2 _1 L! Z) N6 S! ~$ C
int main(); I" N' c& C- G6 ]  z! O8 B% Z. S
{! Z/ w/ K) f  i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: Q0 k6 [7 q3 s' ?/ C5 t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, m8 O! F" F% w$ q+ w
2 x' `9 f5 _9 q" ~  o) P        while(1)# k4 ]2 }* {3 k4 }' J0 |! F4 U
        {$ _7 D0 F( P( u& j) u3 [6 K
                read_MSG_buffer(pshreRAM);' q/ ^4 p8 U0 Y: s, o
        }               
/ F0 M" D( V, }. M3 ~}2 d" {" ~) P+ @' P( M) S2 S

; {1 M. V' ?' z0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 ~" R% y. j  q% |{8 G( a8 P) R  {/ J0 y( ~9 R
        RX_MSG_PROTOCOL buf;9 s" Y; z4 Q2 o7 S! i; |/ {3 ]
        2 `, f  E. [1 Y( g6 ^8 _) t: e, A
        buf.a = pshreRAM->a;- e! v5 A, t3 ^; I7 Q' M
        buf.b = pshreRAM->b;2 V: D8 a/ _4 K4 f, n
        buf.packet_cout = pshreRAM->packet_cout;
0 j0 |- Y% t1 R# _* {+ v5 O. c/ d$ c        
" d. [: e1 P2 h) L2 Q6 Z  v2 r        if(buf.packet_cout != count_copy)# Z, O# |. {5 e& C5 h
        {* h& \: W; r" |
                printf("a is %d\n", buf.a);
+ t7 [) ~7 x2 L                printf("b is %d\n", buf.b);/ s; M) }( j' R8 O0 C0 F& X9 |# i. r& @
                printf("count is %d\n", buf.packet_cout);' |. W# |: I2 }9 V) U
                count_copy = buf.packet_cout;
6 S9 L8 ?$ B) C' w$ |        }
, t3 {; m/ C9 w  R( \' X- y% x8 m        else
4 b4 D* ?* B" G7 |# [* Z( a        {  H: X5 g9 ~& f  [4 E! W
                printf("No effective message!");4 ^3 C2 {1 q& L, x
        }
. B* @" p$ i. U7 Y}/ B" U, h0 ?' d; d. e" h" k# H2 O% ?6 X

  j' ?. Q# Q% z: I8 [
# t! i/ Z& a  Y  J5 x1 y) q7 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" n  P+ M6 z2 d$ }3 D& S
使用下面代码,对内存使用了mmap函数后:
0 `. `3 e! K) U8 I9 p: i7 x' T#include <stdio.h>
, `9 S: o$ e$ t8 g* E; C- w#include <unistd.h>
/ `0 A' q( n: W( K* I4 u& m#include <sys/mman.h>
# e) @9 f8 T. A2 @( B  E#include <sys/types.h>
) t% D7 u: E7 D6 ^6 |0 U#include <fcntl.h>
5 m; g+ k) r6 X: [# n! Z2 B
) h1 p5 a9 k# d; C& a7 t1 O, u#define SHAER_RAM_BASE_ADDR    (0x80000000), C% @. E, D9 i2 W- o8 O0 |
#define SHAER_RAM_SIZE         (0x20000)   9 Y! U2 @% d9 p! p) f5 L, G
, _+ t+ _  S; n, s; m+ B
typedef struct4 E& C# P; b4 B. S( A: [
{
6 Z" c* M9 I+ ^6 S9 f        unsigned int a;
  D# a" g2 e& d/ m  f        unsigned int b;
/ j  i5 Y7 L# z        unsigned int packet_cout;
8 O2 P4 O4 d0 e- [" r7 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 r( L: E/ P0 C% m0 m- ~) y$ p1 [: r/ K# M8 X
void read_MSG_buffer(int *baseaddr);
* V$ c6 S% q3 u5 g' _3 |: t7 @unsigned int count_copy = 0;
- t3 d* a9 ]/ e' d* W- L) Z" N7 Z: S1 l4 i
int main()
) s. w8 }1 l% d6 Y( r. F1 @{+ q% p6 G/ |( a, j3 v4 ^
        int fd;
4 ^. R1 q1 D- c' ~! l        int *mem = NULL;
6 B* x9 Q0 w( h" T9 S! `  b# p' K6 X, y1 V6 `
        if((fd = open("/dev/mem", O_RDWR)) <0), ^# `: [+ |- U' A* L( m
        {' `# B" e9 G" Y7 v/ ^4 \
                perror("open error");
9 F5 p2 Q) ]  P' o3 m                return -1;. w0 C# s# P2 L6 Y( T$ p
        }- K% n. V' I" |. @1 g
        
3 N1 h; K4 C7 K( U# r# S3 d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 i0 a7 [3 ]" V: P7 l" j$ I' U+ G
/ G& g' w. S+ A3 S. `8 a6 h/ B/ S        while(1)
, S* o/ T2 E' s6 y) F' K        {5 l; r5 d" w! i# ]/ c
                read_MSG_buffer(mem);# g3 T' o  B7 e3 y
        }               
- q; g' y' I5 X0 }8 U9 z}
' L: O2 v; ?$ U2 c% y; I
' v; w9 d% l* I. v9 Z' P( kvoid read_MSG_buffer(int *baseaddr)% ]' K9 F7 c  Z/ [7 |3 j
{
6 [  C+ t$ t) |$ j( N0 l        pRX_MSG_PROTOCOL pshreRAM = NULL;4 @! v& U, m- L4 x! ~9 v" I6 b

7 a/ l- N) Z2 k4 R$ ^" P( Z$ d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( S( F( x! ^1 G- m8 {# R
2 K0 _2 m& _, a! E. u1 d0 H: ~        if(pshreRAM->packet_cout != count_copy)0 Q3 _) Q2 g2 c( g7 q
        {2 b: m  c$ r; C$ \* i
                printf("a is %d\n", pshreRAM->a);
( E. \& e. e" `6 _+ y- B% P                printf("b is %d\n", pshreRAM->b);
/ N- Z4 y; d9 W& ^; x6 y                printf("count is %d\n", pshreRAM->packet_cout);' A7 J- S  \& w
                count_copy = pshreRAM->packet_cout;5 ]" v+ X; p9 ]( G4 T( q4 c  H3 ^
        }
. \" T1 V: _8 V  M6 b/ ^        else
( O- _; S; k% @4 l4 D        {8 I" m. Y- E, X+ Z
                printf("No effective message!\n");7 x* f: ]5 e4 h" b
        }+ D: s, _$ }* o( z& ]- z
}
6 V# @: S( A+ w. J4 [2 d# b" [7 o# i& g7 C; v9 _, ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: A  U) X- ?, X) A8 d$ G8 J. h6 `, ~( P' B8 U* U7 j, ]
9 M3 U* L8 y4 P/ ]; C$ Z
) @  T. a1 Y2 X/ q: Z

4 \& M+ _8 X* [% Z& Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-17 19:14 , Processed in 0.043559 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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