OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 m/ l+ B0 j7 k/ U, k' U

+ l4 ]# p3 K' Y" o6 O3 B  h0 qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, y1 p6 \- i* [- ?; \
#include <unistd.h>, w; U, N2 m+ f# H
#include <sys/mman.h>- F% }3 M2 q( `. M0 Z
#include <sys/types.h>' }- w4 Z! Y( M) {" ~5 \5 P  m
#include <fcntl.h>  X; Y) L4 y+ l% @' P

! [9 p* `2 U7 N# R#define SHAER_RAM_BASE_ADDR    (0x80000000)   * m  T7 O$ V6 R" k: j

" Q! I7 C  g- `" htypedef struct- _, @5 [5 O  E7 }
{# e4 u) o+ n8 M3 v" _! e
        unsigned int a;
" `. ?8 v1 N" X2 D: _0 [        unsigned int b;! u- d0 T" t* t( [4 ^/ d
        unsigned int packet_cout;
6 E. d6 @+ g: V0 {0 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ W+ ?5 `* E, U- s% u* F

) r  I  W& g1 j+ b+ Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  e( X4 ]' w/ _1 y" g9 f# Dunsigned int count_copy = 0;
0 B0 a  V8 ~) u* B7 y9 B$ S6 Z
4 T3 e% c0 D8 I3 [; J" {$ C- R- `: G" ?8 h( M
int main()( z- a$ B% J; v0 n
{* V# M8 q' S" a5 Z( H$ N1 B( O% v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Y" |' `+ J  x* m2 c( P, M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 L3 [: j+ s: f9 y1 J5 l9 v

  p; }% A% P5 l        while(1)1 ]# ^. x2 H9 X" [% [
        {- I! x* C: T1 |& P( G1 w
                read_MSG_buffer(pshreRAM);
  R' M5 j! ?' G' [        }               
1 ?  @' x9 c* ?5 F}
+ f( }8 r8 X. f& S6 B- h$ B* o) U* @3 p! F7 |2 x! C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' g- h( }/ c2 n7 U5 x* O{
$ l! Y* z+ k& S3 a, p) A        RX_MSG_PROTOCOL buf;; B' h# t8 w1 I: r6 l
        
  c% t# O) @3 f% b0 \( ?3 ]        buf.a = pshreRAM->a;
( U8 Q" N( W' l. Q        buf.b = pshreRAM->b;
. K* @) r$ K  v) Q- T. |! b" P        buf.packet_cout = pshreRAM->packet_cout;
5 t5 x: s: Y; g2 V8 T        
2 v8 L& `. y& K9 f        if(buf.packet_cout != count_copy); Q. v6 r- o: g
        {/ _9 P) F6 R& R# N& s. f
                printf("a is %d\n", buf.a);
8 C# Y% X- O# l8 R- o. T2 H" A9 `/ E                printf("b is %d\n", buf.b);4 |0 O' i% [( u; w! Q
                printf("count is %d\n", buf.packet_cout);
; G% T) a( U! j$ x( n/ W0 ]; t                count_copy = buf.packet_cout;
( w' C1 j6 R; A7 T        }3 u' L1 H% P7 v& k6 n: r4 R$ x
        else5 ], M2 X0 Z: Y# H4 C- ^
        {# t) a. j7 F" H. T
                printf("No effective message!");! ^* E" i8 S: }/ l" u7 R
        }- w3 j% {, |; C% \9 u' r$ e" D
}
) v# l( ~- w5 q$ N- |5 X7 q; Z' b- b1 o3 F% O% X
( h- A$ q& U" |8 |* }5 z- Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" k6 A5 S4 U8 r
使用下面代码,对内存使用了mmap函数后:
, U3 I$ w0 O: a4 A#include <stdio.h>0 J% Y5 N9 ~, l( D  |
#include <unistd.h>
% A2 m. d2 j8 a# [  p#include <sys/mman.h>9 H8 V5 D8 j" ~$ e
#include <sys/types.h>& t  W/ b" ~% Z9 j( }/ k+ \
#include <fcntl.h>2 W, l- c. @# e8 @4 G
$ P3 v! r, C1 r8 d" W$ x5 ]/ ^1 y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) ?3 M8 B) \2 i5 f- r7 l#define SHAER_RAM_SIZE         (0x20000)   
! K" S& ]' S& z5 Z9 C6 {  E' e* m7 a' {8 }7 W
typedef struct5 G- X: K* `8 v; e- U. k& W
{
2 \7 `9 A6 c4 g        unsigned int a;
1 w5 J, ?7 z$ U        unsigned int b;
' o! ]& ?# ^4 {' \. @        unsigned int packet_cout;
4 b8 W4 k1 P7 [$ P' t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! k- d+ j/ X% A3 j4 d+ S" H& J: C( X
0 v7 m- |" t4 U
void read_MSG_buffer(int *baseaddr);+ X/ r! l! l3 T) f
unsigned int count_copy = 0;
; M# d1 z4 g6 {5 |. P+ [$ i3 W" W- j2 B+ `
int main()6 ~$ Y/ \$ H/ L& B& s  c
{. |; z. \5 n; F$ _$ j1 K- Q
        int fd;, b' e; K  T. k" W; d2 E  J
        int *mem = NULL;$ J9 E% f5 U& W6 _1 N. r. k
1 W$ b! Y) o" J8 o
        if((fd = open("/dev/mem", O_RDWR)) <0)  L3 s2 Z# d1 |
        {
- O2 c% T& R7 Z" c$ F3 \6 O6 n                perror("open error");
( ]8 W, [  Q& I- @' j                return -1;
* o% T. L# K( o; g        }1 [6 H' h' l7 E8 F; v+ g) r+ z1 f  t& K
        1 \* p6 }5 a1 T0 d4 E/ W! J0 t' r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* G+ e2 `( k( s0 U2 _
+ _* K. L+ Z( u' C+ o2 K( @
        while(1)
; G& ]( F: s, G- j6 [        {4 l- v+ o- r3 S% g  R0 @
                read_MSG_buffer(mem);: v, q4 E6 j: x# p
        }               
1 ~, M5 v1 C+ A/ O1 \}
" A: S$ _$ Y- I
9 J7 N9 M- I7 ]+ Y( e) H" Y9 Dvoid read_MSG_buffer(int *baseaddr)1 M) ^/ i) B; v( Q* {
{+ w6 V6 p' X7 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; G- e& m+ a5 C3 y+ I# W, s/ _% }/ c4 S$ F  q. N& @2 {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' l. m) z# @1 Z, f9 Z, {
8 E! B9 n- y: h$ ?! ?& S, U        if(pshreRAM->packet_cout != count_copy)( u- h4 ]8 m0 a+ {
        {  @8 ]8 G+ Z3 t3 f; r) m
                printf("a is %d\n", pshreRAM->a);% `9 a/ Z1 t5 f( p
                printf("b is %d\n", pshreRAM->b);
9 K9 k, p0 _* y                printf("count is %d\n", pshreRAM->packet_cout);, E) N" c5 }' l5 Z! Y0 o
                count_copy = pshreRAM->packet_cout;
( K" M7 _/ U, m$ V3 e& u& [, w: y        }& F* m. d& U: Y8 i6 w) p
        else# ^1 M6 Z6 F3 j$ _) g9 T, j  _! h
        {  g0 k, s! g9 _- m2 c
                printf("No effective message!\n");
8 y4 U8 @' i7 s        }4 x# i" l2 B2 s( L
}+ q/ }/ w! d! l9 n6 w# S
3 {! K. u) g, M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 K) B; ]" ~& Z- w5 e- O% D8 c3 Y

3 ~! C* O; S3 t* j' g1 a7 L
1 i( @' h4 m, p% r' R/ r
! M% X! U( ?5 k  u* _# y5 m+ a4 K. c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-27 06:04 , Processed in 0.042933 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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