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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& R% }' Z* Q, W5 H5 J# g8 S# u$ ~# _& @. p6 k8 ?8 x) g$ B% S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: I9 t* v/ G, |1 k% @" Y
#include <unistd.h>! F, C0 h& U, x8 N$ b1 {- i
#include <sys/mman.h>4 t' v" b: k3 g' a
#include <sys/types.h>
4 w$ x* L6 f! f#include <fcntl.h>, ~( [# z+ [$ Z9 o4 _" ^
/ r) ~) K3 S" D0 h1 Z9 P: b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * k4 [( S6 {* a/ c/ s8 _/ G
, R/ c9 G5 u  f
typedef struct+ P& t2 @9 @# h" D) B
{2 \+ V$ t5 F' r+ z
        unsigned int a;
# w* u& @7 Q: ~1 t        unsigned int b;
2 Z: s& r- X2 D        unsigned int packet_cout;0 ?9 P5 d% c. Z8 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( u2 y, V( R3 F$ Z2 Z

  Z( y4 ^4 N! A- m# L: u, E( a0 }! _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( {7 Q* p( v# ]unsigned int count_copy = 0;
0 v! @5 _$ ?  W8 d' K) V2 H( Y$ `  h9 @6 ~% w1 |) ^

; ~  r4 \* ?$ b) }5 qint main()- v. x* h& D# I% B
{% k$ F! ^! @) r1 B! E+ Y( e1 g! i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ h/ B: a5 h- i# y+ t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ c/ ^6 l4 N" g

( U6 y/ f+ l; b5 p+ ^! V  I2 J6 a        while(1)
) k, U% l/ o2 O5 r! u/ @8 \" a        {8 I& {$ N4 g5 f# E
                read_MSG_buffer(pshreRAM);+ [$ y+ T* ^$ k2 _' U, ~3 V1 _
        }               
# f4 k) w, |0 c& b' x' B}  R4 T8 t0 _) Q. F- J# w
0 U7 c- W; |6 M& s/ @) p( {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( T7 u' b+ u' l3 h' L{8 g& I$ z$ o6 R! J, }2 T) k  c6 `; B' M
        RX_MSG_PROTOCOL buf;( r$ d/ D0 ?: F( |
        
6 B+ C$ Z# D  b5 t. q4 s1 o+ Z. d        buf.a = pshreRAM->a;
/ z/ u/ n, G8 {! c3 L& b        buf.b = pshreRAM->b;
  m  [; F4 t/ L( n& J/ B# d0 q        buf.packet_cout = pshreRAM->packet_cout;
# U3 M6 P# z# S( Z5 ]9 _& E          W8 w2 \: v% d0 {/ d" i2 n
        if(buf.packet_cout != count_copy)# s) K- ?8 P2 J* v, Y6 U
        {
# ~5 m, ^5 D8 j                printf("a is %d\n", buf.a);
9 k% c, \* [+ e( Q                printf("b is %d\n", buf.b);
4 ?( z  w2 i& D6 q+ i5 Z( G                printf("count is %d\n", buf.packet_cout);) n/ d% Q' w: h7 ~$ O5 F! `% L2 {) Z
                count_copy = buf.packet_cout;
5 H) s5 w* y( J: c0 X% d        }
2 B* R( t- J1 |! E2 I( o# `8 K# X  L        else" h+ M2 i$ y/ F" t+ h# l5 M: {" Q
        {
$ `( A' y4 j( p- G: U1 P                printf("No effective message!");
7 d5 {# V0 `* {" A1 P) k$ ^3 J        }
% C# G4 G( ^# Q0 I: \}
, o2 i4 I% \/ p# n! T1 |" n$ _6 g* b3 v7 K" ], M" |

' X2 M) v* w. I' }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; s& G; j1 r- e3 ?1 C3 ^使用下面代码,对内存使用了mmap函数后:* x, i8 [$ c7 M
#include <stdio.h>  s+ h4 f& p2 K" N0 |
#include <unistd.h>% o0 C. I' K5 B1 T
#include <sys/mman.h>
  U$ \2 e) n- x0 ?' Y, s#include <sys/types.h>' P- C/ P4 r) j  H- P$ q
#include <fcntl.h>
8 E# u" E: K; q; }3 |3 ?+ J7 {  b  h2 m9 k2 ]( B
#define SHAER_RAM_BASE_ADDR    (0x80000000)# S* P$ M) m2 q% ?% W1 T
#define SHAER_RAM_SIZE         (0x20000)   
! ?7 t( p4 ^1 \, E( h9 {8 B3 v6 j$ I3 I8 x& p
typedef struct
% h- m1 E- r5 a3 p9 m; C{! \2 `1 K  `+ A
        unsigned int a;) j& ~- P+ O" `, x# I( z3 P
        unsigned int b;2 ^7 X# \7 m/ d7 o' w, ^* M1 Q6 a
        unsigned int packet_cout;5 q% U3 I0 m) r( u2 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 c: f. m8 A) z6 L  u( B3 C  v, b8 A  B" |3 M3 p1 ?1 ~. v# E" w5 ~
void read_MSG_buffer(int *baseaddr);1 l! H# a, v0 Z' b+ {0 L
unsigned int count_copy = 0;0 S( J" q# U+ ~1 Q0 r7 S* Y
# `8 x. m1 S; R& G
int main()
' G8 o& S2 c3 S, ], s{5 y/ \) T2 h* N+ \# F' ?
        int fd;7 ?7 W  d3 N: x: D
        int *mem = NULL;  U% E# l* `( Q; Q1 F, G
! _4 N! }- l9 ?% f9 y
        if((fd = open("/dev/mem", O_RDWR)) <0)
% K* D4 F: J* G6 {        {
8 H; K- @5 p& ?- a3 x& N3 S# G                perror("open error");
' w* f( v* v6 d' f/ a" o                return -1;
" C& a$ t1 R# X' l6 x        }) ^% }. G. s, n) o
        " v& _0 t8 p& g. W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 k: ?2 l" u0 P$ h1 r9 a( A& O3 G1 z3 W8 @4 h# |
        while(1)) C2 i  p. \  n: m' P0 A
        {
' y' G- R" P2 Z2 S' k                read_MSG_buffer(mem);
2 ]0 l% g: H* A" y        }               
$ L- Y* |+ D# ]0 c}$ K/ V4 G& ~* Q9 H, z2 `0 Q  v

$ [9 I3 Z% F; G, Wvoid read_MSG_buffer(int *baseaddr)5 q5 ]) ^9 |" A2 ]
{
: U' q- A9 u- W( C- b( u        pRX_MSG_PROTOCOL pshreRAM = NULL;
& l1 r7 f, N3 ^3 p$ m4 L" M9 K) K' e' ~. Q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 Q! i4 `& K1 u# r

9 J; ~4 L  {% L0 m' h        if(pshreRAM->packet_cout != count_copy)
& s7 [. W  m$ R4 w6 p& @        {
3 G: B2 v( z2 U6 Y                printf("a is %d\n", pshreRAM->a);' r$ e1 B( g0 ~# L
                printf("b is %d\n", pshreRAM->b);
1 T5 t% e6 P; I3 ~                printf("count is %d\n", pshreRAM->packet_cout);
" x; P2 l/ Y# v) q; y- Q                count_copy = pshreRAM->packet_cout;3 I, o/ Q! x- \, q: U9 G1 g
        }
7 u# M. n" V7 F- N        else
6 E, o8 l# w- g0 G& F% E        {" ~* I& g' e1 H' J
                printf("No effective message!\n");( c/ \. h; s% b$ b- w
        }$ Q6 \6 y( \$ ?# U: P4 P
}
( M9 W5 _8 {3 O
& c' A3 e( q* V8 T8 C没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 b2 b* F) N3 Q0 q% l' }( T

9 u7 d2 z# T+ g  d) k
" ?: t2 m& \7 p# ?; P+ A9 V% e0 B/ L
9 |4 ~9 @% [5 Q* |& W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-9 18:20 , Processed in 0.039166 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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