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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! O) H% e9 p4 G! r# [& B
8 }2 t0 A% A, c& \1 u7 oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& T+ ]) k& w' y
#include <unistd.h>
; y7 \' p7 d( r) n$ N#include <sys/mman.h>
( F3 C7 a7 X# U' Q$ F& ~#include <sys/types.h>9 ]7 v5 O* b  u1 x
#include <fcntl.h>1 P0 J6 C+ E+ [3 l
  ?9 T" N9 `0 M9 g% D1 \" Q% L
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; i) F, [9 |+ g# n4 U2 d1 Y& @; w/ l% [" h$ y/ ?- {
typedef struct
# W1 b9 U3 p; N, H- c# o{
" `$ D, h9 c: C- ^        unsigned int a;
- q5 L1 u* h+ k1 N3 T  }        unsigned int b;
6 s7 ]5 D4 I4 F1 K6 U! y/ z, A- A        unsigned int packet_cout;
# h* W; [8 `& s% @; E1 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' R7 v! L& [7 }$ R  ~1 \8 M4 V

" d: D" f( @% R6 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 J; Y. R7 h  G* Q# M& I  j
unsigned int count_copy = 0;, s3 T: H8 \1 Y  q8 u- S6 H$ R
! ?7 G7 Y# P6 l' F0 ?. ^( d3 ^, q5 \

' G# b/ T% _4 ]+ p- Y: u! }2 y2 yint main()6 {* M/ o9 ?- q
{
0 g+ k$ I  V/ E& n, C6 ~8 x        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ C0 ]- T& T: e+ F        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! O2 R! P4 V' `; E" Z# q! {" X" ~
        while(1)# o) b" H/ z0 O/ h+ M" H
        {: K, ]- H4 u' R) u  K
                read_MSG_buffer(pshreRAM);
( X" @' H0 u! t0 i# I* L        }               
" o  X- s" ^8 h, B/ b0 v! r- Q: j}2 x# `  D( p6 z9 ]% m$ B' p$ N

0 x  [2 b' Z% y) @2 ~1 z  v. ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 q0 P9 u7 X$ f1 ]6 u, H{! `& G1 u" ^& r! o/ a
        RX_MSG_PROTOCOL buf;
8 N2 n4 w( ~; k' |) ]        
" Y- u: I% `8 G  w) E        buf.a = pshreRAM->a;  j, j& x; B( T! m. g" e' p
        buf.b = pshreRAM->b;# |0 g+ Y4 F2 z8 a& ^
        buf.packet_cout = pshreRAM->packet_cout;& `- h$ L+ m4 h0 u/ V$ X
        
$ t& B  W' i8 @4 f6 Y        if(buf.packet_cout != count_copy)0 r! f9 ~  g- }' f/ O" z& z
        {
0 B3 j9 |# s4 T5 t' o+ L                printf("a is %d\n", buf.a);
9 e  ?# I, U, y* ~                printf("b is %d\n", buf.b);
. Z) G2 p0 h3 R                printf("count is %d\n", buf.packet_cout);
( f* G, R4 ^. A/ g' h$ g  g4 N) Q2 V                count_copy = buf.packet_cout;
9 ]1 }2 [+ w- `% `' v        }5 a! z" S1 F1 O4 z, `
        else
7 j2 {$ T' w9 w        {$ Z' Z8 t- ~  z0 C
                printf("No effective message!");
0 ^6 n0 ^6 [$ c! Z2 Y" W3 n& a        }7 X9 t4 m8 @( U- `( W4 B
}
% x# n% C7 f  f$ C7 e' x
- P+ @# J/ a/ D+ d2 g1 T. G: X/ ~- z) H: Q+ j1 N$ ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 q+ E+ C% c; U3 c# H
使用下面代码,对内存使用了mmap函数后:3 G- H# m" M! G. p
#include <stdio.h>" i$ w. H8 T) p3 F2 J) H  t4 c
#include <unistd.h>
, {) T% z: E  r8 }#include <sys/mman.h>1 M' E# R5 Y; W
#include <sys/types.h>
7 J- v4 _. x/ Z! d0 V#include <fcntl.h>: B4 t4 B. _; C1 M8 C6 b

( ]5 k; p5 f' d2 J5 k0 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 n* N# H: }8 t0 u  Z1 X  z% q; c# `#define SHAER_RAM_SIZE         (0x20000)   
  D; @, S7 Y3 |. B
- C6 v& }# {# Itypedef struct
- W3 V, Y8 C7 I' ~; B; x; t+ ~{- A. ^8 l7 w$ n" o( ]( W5 X1 {1 `! x
        unsigned int a;' Q/ U6 ~- c1 p, {, ~0 @, M
        unsigned int b;
) M5 Q( A  [5 l! G        unsigned int packet_cout;
+ O1 l3 _" C8 S8 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& _" r& K# a  c3 u

' ~6 R8 D' N5 K! Gvoid read_MSG_buffer(int *baseaddr);9 o4 Y( p- M$ ^2 u  f  w
unsigned int count_copy = 0;
- v& @: F  }! L
' ^' ]4 g+ K% W0 j# v3 Fint main()# Z2 t/ G/ j2 O
{8 ^, k' S& }4 ^
        int fd;( F0 N! d% J; x5 M6 {* E
        int *mem = NULL;
: }0 Y5 ^  J4 M
/ ]$ v, }, O  o. p+ a4 u        if((fd = open("/dev/mem", O_RDWR)) <0)
' `" ]! w5 U1 l% s8 K8 N/ F' r        {' I# O1 T  ^* `. `
                perror("open error");
0 k# c8 D* M1 N0 v                return -1;) J+ y4 U3 p  v) L. I
        }
- o: s3 Y  w' f$ B$ p        / z3 R$ j0 m3 w4 t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' n: e9 d' e5 i9 _" r% Z( @2 Y3 f- Z8 F2 L
        while(1)
/ {- |9 \# y! a3 V# B        {
9 n9 n% l( j& P3 G. [                read_MSG_buffer(mem);
: H; L+ s5 N( L1 i9 p) |% l4 d        }               
2 ?: h# a$ T2 g0 t; y}
9 y) [' i1 u) V9 V) X
, @( X4 r/ @( |6 N5 o9 Vvoid read_MSG_buffer(int *baseaddr)
6 |5 A0 @$ t! p4 q% v, f{
" n4 @1 ~0 z% m/ g9 P        pRX_MSG_PROTOCOL pshreRAM = NULL;
, }' t0 S2 J, I) T* \  E% I; _. X3 S/ Y6 p3 M9 X" i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 e& [3 i5 |) r6 M  @. V: z/ O% ~
" U% a, c5 D4 y
        if(pshreRAM->packet_cout != count_copy)3 p  n: p% ]' {, Q
        {( W& z3 D1 E& {5 c
                printf("a is %d\n", pshreRAM->a);. H' b1 |* T( V8 Q5 \
                printf("b is %d\n", pshreRAM->b);
5 @% Q0 \6 i6 M; }, ~7 f8 q/ `' v4 f                printf("count is %d\n", pshreRAM->packet_cout);
: |' O' Q: I# u                count_copy = pshreRAM->packet_cout;9 `1 @5 A) Y4 I
        }7 K+ Q2 E) k' }# H6 e8 A! E# l0 E8 r- N
        else4 @- b( [5 O0 @- b* y2 z& ?5 j% a  d( f
        {! }3 N' f6 ?$ g+ ]
                printf("No effective message!\n");% y# T1 r0 ?; D6 C3 g& S
        }4 q! N& _. h$ R
}# J) T( ~  d0 }4 Y; `) e; L3 V7 p# Y

5 g/ H) e8 \9 V5 s1 D! S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% F( v$ H, B8 ^7 K/ R3 G6 ]; a6 R3 f' t0 a0 |5 ~7 S$ ?6 @

9 r' t: a: T5 V3 o4 O, f9 d: C9 y7 s
- ^8 N* ]+ c: Z9 T! T6 g! ]! R& j4 ^, Q: K6 @8 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 14:27 , Processed in 0.041273 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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