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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # |8 @, h9 I( X+ i

# f3 E1 X+ m2 M0 }. Y( ]: G6 k  uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' d9 F2 i* l& j* A) C* E8 E#include <unistd.h>
7 n, C- \% I$ {" H* C% v#include <sys/mman.h>
/ u8 a8 e+ k- k& d#include <sys/types.h>0 }. f5 l! x* ]* H
#include <fcntl.h>
9 U1 ?% _# g1 L! b8 t2 Y" u8 M% x6 i  l' G1 F" K
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' u% L+ M3 w) w2 a8 j1 S4 L3 E3 v" [2 ?" {8 F* [9 q; s* `6 P
typedef struct
* n  @8 G1 q" n, d{
; `7 H% Y( g; Y! I7 `- g/ D  z        unsigned int a;
3 E/ Y7 c6 c" D* A        unsigned int b;
$ e0 E& X7 V% m6 |6 G/ K! K! z& T        unsigned int packet_cout;
4 @# F) Y: ~* ~, m" k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! j3 W+ l/ \7 d5 }

  ^' e8 f0 }; w1 f1 E) G, ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 T; b% {; e& q: X+ ]- X+ z
unsigned int count_copy = 0;
2 [% F: a$ U5 @$ y) g4 d7 [9 H9 `$ V' P: \& f7 S, k9 w: ~

# \! }: {( l- K9 W8 e0 _0 X; gint main()
) ]- Y2 N! D+ I7 o7 L* _! U{
% ^8 ~- D5 D) B: l; v        pRX_MSG_PROTOCOL pshreRAM = NULL;) {2 V) h! n% z$ T0 D; y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! H. n% J, x) c
6 l7 C. ]/ Y: X6 @; [
        while(1)% X3 [0 }" `. T1 U  m
        {9 ~9 o' t9 a  J7 N. O2 I  a5 ?
                read_MSG_buffer(pshreRAM);" A% d' y0 B$ v% \: h
        }                , B" K* i  f8 ]% n5 b% L. _
}( Z9 L+ R) {0 R
9 V1 N5 G; f: c* l3 w2 q  c+ d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 t* z9 |* K" S" h: `' q
{
5 g$ o& C: c# s" t" ?" G        RX_MSG_PROTOCOL buf;; E  c7 P2 C; y  `; u& ]) X
        
8 D7 t8 V" `4 _  L, z        buf.a = pshreRAM->a;! k" X. V: F9 _  m2 f0 ?! q
        buf.b = pshreRAM->b;  p; {  [& k) q+ h8 e8 V/ u8 Q' W
        buf.packet_cout = pshreRAM->packet_cout;) @7 Z% [9 i. X4 `5 U: s# y
        
1 s$ @6 d; b" [  a' p; o' ], c        if(buf.packet_cout != count_copy)! K4 G& Z1 B7 |  q2 C5 d4 Q
        {8 ^- n% U$ Z- c8 A% a
                printf("a is %d\n", buf.a);
# N$ G! A* }' O! n6 S0 R                printf("b is %d\n", buf.b);" t1 v& r9 Q8 B$ W. D3 f, ?  a; Z
                printf("count is %d\n", buf.packet_cout);2 k4 ^# t' F) t
                count_copy = buf.packet_cout;& l  W$ T* W0 B0 U$ Z+ o) p" j
        }- Q3 l+ M; Q& o! K; U
        else
2 H: a/ \$ s- o        {
0 y+ w: p* U1 N0 l2 B9 R                printf("No effective message!");
2 ^" m  x0 J# T- @! G        }
4 g  X( z6 j# `/ v}
* t+ I$ T" u; q' }
, B5 P0 F2 ~2 X. v
. F- D* ^# N% J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) s# ]+ ]7 \$ c8 y* [  `9 u
使用下面代码,对内存使用了mmap函数后:/ [- Z& Z4 |& W3 V- T- d
#include <stdio.h>
: B- {$ I& k& Q9 m#include <unistd.h>
- J/ t! r- v, P+ ~) g) S4 l6 y#include <sys/mman.h>2 L: F6 A. C  c# X: z
#include <sys/types.h>
# G" `) J6 {3 R8 b6 _  G: R#include <fcntl.h>
+ T7 j( S+ Z5 K: M& L- E, N4 @3 I0 Y" Y/ ?: k# @: F% B! N
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 @$ w6 p0 a. ]) l' [#define SHAER_RAM_SIZE         (0x20000)   , b, ], a# X6 ]
( M& h. C5 M; f' V, N7 s. |
typedef struct
% o* @- {! Z( _{
9 a. I% c1 A( a  D  u        unsigned int a;/ J- g$ s* |6 n7 s- u8 p" k% F. ]
        unsigned int b;
: r" c. {+ H  S  S  Q        unsigned int packet_cout;
  K' ]% P9 `) ?/ R4 a! g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 }. A8 g9 {" w: G- C  T/ c) e7 S
. Z  U& o0 Y" B9 S: i! I7 I. ]void read_MSG_buffer(int *baseaddr);5 Z4 |- J' ?0 @
unsigned int count_copy = 0;
0 u, [3 X- D/ a+ E  L0 L+ t& Q6 m4 s! a/ V
int main()- v4 b! {  L( y8 S! I
{
1 }# Z' m) D  W' n6 d        int fd;3 [# z( {* G, R- Z) J
        int *mem = NULL;
7 j. z) ?: H, i5 \' g, W' D- Y* {/ }2 t6 H2 t1 K& b8 l
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 c' V/ q, U# q3 ~& G1 t        {
1 _5 p# b7 y( t- U0 F                perror("open error");
* ~. C; g( B; [- ^                return -1;7 @0 _) N8 k8 P5 H. N( C1 y* P  l
        }& m, d) S$ _! o! }5 @5 w
        
9 T# y3 S8 b, f5 c/ F* }2 S5 b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 G: t  U: ~+ g: v! W
2 E( H: r3 o3 L, ~5 g' _9 z        while(1): K% c" v" B) t, f( Y- V
        {
+ O0 q" D( a# _, o                read_MSG_buffer(mem);
# G+ ?) M. e- o! A2 ^% Y& T4 N        }               
# A* @4 g9 n' P* d: u/ w4 x}
  n# s: V* [' Z; m' ?% x; [
5 e% M! I: ?; \, Bvoid read_MSG_buffer(int *baseaddr)
2 m. {9 q! N5 W5 o( z# T( y/ h{
1 A5 d3 Q4 t/ _2 Q/ m6 I        pRX_MSG_PROTOCOL pshreRAM = NULL;- o9 s- H% R0 p7 W# u
( j0 V1 I  N5 i- z$ V, e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 b% p! B& y3 w7 @1 F! @' d* e
" w# M' J1 w( ?        if(pshreRAM->packet_cout != count_copy)- [6 H/ Y3 o  j9 a6 v9 t
        {
2 O9 ~" Z. m* H9 M                printf("a is %d\n", pshreRAM->a);
& R  t3 E6 c- \/ C                printf("b is %d\n", pshreRAM->b);# m  I+ c' q, _+ h
                printf("count is %d\n", pshreRAM->packet_cout);+ j4 L; Z- _9 J. Y- l
                count_copy = pshreRAM->packet_cout;1 w. [- T( D* z3 V# f* J. z$ }2 O
        }
; u6 _% \5 B7 [7 }  e) K( o7 X        else
# r4 Z$ e$ {( Z' o* f9 p; _2 s+ x: P        {
7 O2 M0 t3 M, l# I' m3 G: A- E  l                printf("No effective message!\n");
# t3 [9 B! M9 U4 p8 _        }
" ~1 Q. D2 D  d8 r5 b}
9 [* \& b% p3 k  C. ~  }' j8 j: a  F* ^: b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 i8 U2 E( |+ E( n1 q. U
' Y& ?2 I7 @+ Q* U2 c/ O
  c* m, S) k! u9 g/ v3 ]  O

' H3 m( p' f! |' A
. v' W! w1 j# z, `7 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 21:46 , Processed in 0.039376 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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