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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- u& Y: c7 x" y; `* ^( ~9 c+ U5 N* S# a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% E0 q& |8 N, ]! h- P#include <unistd.h>( |0 F5 Q: g3 t, c/ h5 I8 ^
#include <sys/mman.h>
) g) d- l3 B; S6 M#include <sys/types.h>
1 _6 Q0 T6 P7 A: p1 z# z, d% x#include <fcntl.h>- e7 r2 E9 c( r6 _5 \! s% p
" \) }) Y! _9 X
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 j/ \' X5 c; g/ Z' Q$ |
4 r" N; V& R  [% h
typedef struct
$ P0 {. {# ^" \+ v) W6 j{) c9 o9 u" }% V. [  t) E3 U
        unsigned int a;. |5 @8 d4 W2 Q1 Y8 f1 v
        unsigned int b;1 |$ n% Q& J9 D: q9 m: y! w
        unsigned int packet_cout;- r% d5 p% x/ m$ T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ T; l$ F) W  i3 k2 c6 v$ h2 p9 Q

! Y7 [- p2 g# B* e$ e, Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; R6 W: _2 j$ X! N+ @
unsigned int count_copy = 0;
+ \( {, n* `- G: B6 l/ z# ]9 n! K. q$ G/ Z* N* u; s/ s9 S$ T
* [( z* T2 k1 W6 q0 O$ l& b+ m; l
int main()8 l! o, J9 Z- K/ B
{
% r1 X4 m" |3 |+ b        pRX_MSG_PROTOCOL pshreRAM = NULL;2 [7 S8 p) O/ b! h7 x7 A% H# E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- x) i( U4 y. p# v2 K! q

% H1 u/ l' r, K        while(1)
) U* H/ \; ?# K! f! V' z3 q        {
5 A% d5 i  Y+ y                read_MSG_buffer(pshreRAM);- a; K: g/ r; O- D; f  J9 S0 Q
        }               
+ r. o2 b* Z. m9 f/ X}
0 s4 |$ G, U0 u& {; \
4 W& q5 D( e. D5 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" e& Z6 H8 G9 n+ z" [{
: P- F9 J' _% Z! E$ r        RX_MSG_PROTOCOL buf;
+ u1 [( L; R  @6 j: F( _        
: z5 G) e7 ^) U6 v        buf.a = pshreRAM->a;5 B8 K9 E) ]1 ^7 `( F% O, _* H$ j
        buf.b = pshreRAM->b;- z1 ~2 d* b. q% Q4 K% f
        buf.packet_cout = pshreRAM->packet_cout;1 E( M, ?) C, P# u2 A" N9 {/ A$ G
        * p# R6 j# ]) @7 _& t
        if(buf.packet_cout != count_copy)
1 s, K) k% G" C6 Z) W        {" [( w7 b3 V" G6 w8 h/ }: ]
                printf("a is %d\n", buf.a);3 b6 c$ i# x7 R$ o0 m" ~
                printf("b is %d\n", buf.b);% g  L0 S9 j. ~8 F" |: m8 C
                printf("count is %d\n", buf.packet_cout);5 {9 g7 t6 U/ H; n# l& M
                count_copy = buf.packet_cout;0 j5 K% a2 H% ]
        }
  q# {- b- ]* S        else
) p& @/ u: m( n0 M2 |: F/ J        {) l: S+ y5 w  Y% P
                printf("No effective message!");
$ N) V! g- T7 l% a        }  S: C. ?6 s6 V
}0 P3 b) G4 \& Z+ ~( F; b

8 U) u- a1 C* N; t* _
+ \% W6 y6 d+ _) }; d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 \- Z# `& k3 c使用下面代码,对内存使用了mmap函数后:
1 h' x# v- b# R9 ?! z#include <stdio.h>
) g- F; B) w, j#include <unistd.h>
: U1 _3 l+ [& s, Y  T- r#include <sys/mman.h>
4 j8 P% y$ G6 i/ E. k3 a, I#include <sys/types.h>
# u# P0 O- R* H2 s8 s#include <fcntl.h>3 D1 k1 s. N/ c  h9 u8 A

" i2 h" u9 E4 V% n2 T#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 T, I# T* X2 w#define SHAER_RAM_SIZE         (0x20000)   ) ]5 @! l7 |* ^

4 y1 f) {; M+ ^  a- W7 L, ftypedef struct. c$ i6 x  p6 J/ u8 ~  B! _
{
: B/ p! c8 N$ F3 v! P8 ?9 Q8 X        unsigned int a;/ `; {1 Q# H6 P* K9 G4 n( N
        unsigned int b;
# X+ Z) E2 n3 Y- H        unsigned int packet_cout;' x: Q8 u1 P0 V6 d+ q5 `$ Q/ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  s/ B2 c  y) n- r/ w' G0 z1 {' ]
6 Z, u5 g* \, Z( q' `void read_MSG_buffer(int *baseaddr);
1 E. f' m, q, sunsigned int count_copy = 0;
! T" L8 j- b' m! g1 |; s& e% \- X( i, r/ r6 j) }# K
int main()
. b1 b# c6 p0 f2 l! z4 R7 `% [4 N{
0 ^- U9 \: l/ c0 N3 ^  W        int fd;
- c  f5 S  X$ b' }9 m2 q  u2 U        int *mem = NULL;
) g1 E, h1 K! G/ W) F2 K+ }) d) s- {. x9 Z, n
        if((fd = open("/dev/mem", O_RDWR)) <0)( G/ L# a8 Z& D
        {
8 z. t( _- }, ^: r, H                perror("open error");0 _, R$ X* p# @. T) P
                return -1;" ]* m$ n8 n! T" @
        }
* E, ?; M2 Q0 g* ~        6 H" A/ M% Q8 _5 w$ H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. [( r6 t5 i# v9 E8 m
+ F" ^; l6 r. X+ m% A$ n$ ^        while(1)
$ L. ~& j6 Z( p$ M4 P9 X  l        {* F: {+ o3 p- P' Y! \
                read_MSG_buffer(mem);- P- T9 |) C" U
        }                ) E: N; |/ E( I; P4 N) R& D
}4 h4 S- B$ M" D( f& F

% ?0 h8 B' d! Yvoid read_MSG_buffer(int *baseaddr)
5 f( [& Z! t# @3 k! O. Y0 p{
7 ~$ ]# d/ m  Z  \1 v, z        pRX_MSG_PROTOCOL pshreRAM = NULL;  V5 N, x) t6 \2 w% y1 B* m1 X
& d/ b2 A  z& P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 v6 ?  t6 H2 O0 Y0 J1 R

' k8 Z  q' e) ?, k- r        if(pshreRAM->packet_cout != count_copy)
* i9 K4 x$ N" Q6 X# a2 y- Y' D/ c        {
2 G7 p; R' m+ l3 C                printf("a is %d\n", pshreRAM->a);4 r! n1 a+ N7 M+ k2 a
                printf("b is %d\n", pshreRAM->b);+ j  I6 L! q% u0 g
                printf("count is %d\n", pshreRAM->packet_cout);) n; e1 T- E5 V: M8 K6 Z
                count_copy = pshreRAM->packet_cout;) s+ d, b, n/ n2 x7 L6 L* ~2 b' U8 V
        }
( a6 e0 d2 z. Y7 F$ @$ o; D( @        else
8 B# \9 R7 h0 w; [* w        {
" r; n/ a. z) {% g+ O                printf("No effective message!\n");
- d$ e8 }( N: E+ ?. S        }
& G4 K9 b4 X$ ^, K! B% k6 h}
0 V: {) R( R5 A5 D+ _
0 V) A" ^9 m  S4 |) I4 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 L; h/ j/ }' @' p) i" C
# D. o- x; o/ h# y- y% g* z) ?0 v' K5 e1 \: P: ?( ~# C
' R9 j" C% u4 U
8 ~3 |$ T$ l3 u. l4 R) c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-8 15:33 , Processed in 0.036638 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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