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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 B' W; s2 j1 g) s  G/ i% z% W$ p& I5 U5 z, E" \) p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ |1 N; O0 I- _  y  u9 t#include <unistd.h>; I: |; }( R0 B: H: d
#include <sys/mman.h>
# O& i! h  d- m; i4 h#include <sys/types.h>
& E2 K" ]' b  O( [/ R3 p0 ]#include <fcntl.h>, u$ Y  Z7 s* h
& k; V; \0 w* O* t+ e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . n* e; j, t! P! `

: b- W" [% L# B& wtypedef struct
+ Q  d  {7 U& [( B. |( A9 d' ~{5 K- `; R5 ^/ r7 ^; h
        unsigned int a;! {  ^9 o- W4 |; @( v& O" @
        unsigned int b;
) T- I5 ~2 V7 Y        unsigned int packet_cout;
$ W$ ]3 K, \0 J) V* d& W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 N* U  n" L( b
) b& M! Q/ p0 h# _4 E  `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( T( i  q1 j0 x8 a  A
unsigned int count_copy = 0;
+ W0 @- U" x0 m' {! V* @
- n- ]; W) N, ]9 Q0 x) W& c
& X. H4 Q: v6 mint main()
1 T& j; Z. f: h" x! t{( M2 h* {& K# d$ [
        pRX_MSG_PROTOCOL pshreRAM = NULL;" U: y- y6 g$ ^: P8 m7 E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* i! R2 y# c0 x4 y& Q! r9 [( U4 A, O' \9 t4 A/ W& ?) ~
        while(1)' t& g1 r* K+ `" f
        {5 s  P8 H# v' V( |" N2 w( U
                read_MSG_buffer(pshreRAM);1 i% J+ P1 ?7 V
        }                8 V9 B$ N" G- w( B
}. L$ K, B- _& b. l# r6 y+ r
4 r; D* q& A9 P& G$ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# W; D# s- u3 Z, i{
6 S4 B7 ?# a! C5 R& {4 N5 B6 a        RX_MSG_PROTOCOL buf;
: r5 P6 U8 _4 ~8 W) d          A2 v) v6 K, k+ _- a, n
        buf.a = pshreRAM->a;
# q1 Y6 R. g8 {! K9 R0 w, }- c        buf.b = pshreRAM->b;
* f  X5 E+ c+ Y& ]! F* e4 f0 D        buf.packet_cout = pshreRAM->packet_cout;
3 T: F' X2 {' S- n# {7 K        
% w3 s( h6 X, c8 o2 b5 f, S        if(buf.packet_cout != count_copy)
5 U% ]) k0 b7 c! K, L! N        {2 `% Y! t# Z6 s: F; ?2 i
                printf("a is %d\n", buf.a);
( |' e/ o3 S7 V/ j                printf("b is %d\n", buf.b);- m+ k; q: W$ Z8 w+ g: I2 [
                printf("count is %d\n", buf.packet_cout);& ?2 E$ ~4 a) \) j/ g
                count_copy = buf.packet_cout;
# ]0 j7 e* w+ _1 J8 Q( e        }
+ ~$ |" Z- |; y( {  H# a$ R        else
& ^3 K& {! Y6 M7 B/ I7 N        {
" m9 U; L7 R4 F9 U& w- U9 l7 r                printf("No effective message!");- X8 ^- {$ [1 g3 Z; ]# e& P; A
        }
4 B/ p* o& x. d3 i8 S3 g}
. x. Z2 r! P  ^9 r# Q1 t% V: V1 _
7 N& Q4 O, w1 |& Q$ |" W  |+ a: x) `, ~2 R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ V" l( O3 G( F2 r! q使用下面代码,对内存使用了mmap函数后:
1 m8 n0 g3 J9 J1 V#include <stdio.h>9 X& ^5 n- ^3 l/ K+ I
#include <unistd.h>+ @9 n6 S) J5 q4 T/ Z1 C) O2 z
#include <sys/mman.h>6 j# Z6 e1 B% f% T
#include <sys/types.h>& r- P9 y9 n3 \5 ?, J0 ^' B$ Z2 g
#include <fcntl.h>
$ {0 }* M8 M8 W' w3 U9 h2 E! D
/ o: \- G& l/ T  n2 M#define SHAER_RAM_BASE_ADDR    (0x80000000)
; W5 _+ V+ ~, ^$ U" L( t4 l#define SHAER_RAM_SIZE         (0x20000)   
9 n! w4 K- O! [( B* o' y6 L4 n  l
7 k% |; p5 ]4 D6 l' F3 R3 E2 c# ltypedef struct
( `, Z& s% S9 y7 c2 }{6 `7 D) f. c6 S- M# C2 a  J
        unsigned int a;
4 K* E% r1 A* t: J& t0 [) D        unsigned int b;
) U, }  L  U4 _) w( }' v3 z2 |        unsigned int packet_cout;
; `* Q7 I) C7 |4 v) N9 q3 s' Z. Q0 Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- S( f7 U( Q! f, o9 v

6 u8 [, G- Y8 }void read_MSG_buffer(int *baseaddr);
( k* P' g7 W' A% y% d2 C( N* aunsigned int count_copy = 0;
+ U3 K' [3 Z2 g: o; Z
' P! r# _* A& B( bint main()
1 v" s. b, ]. r7 A  s* g9 O% G5 m{4 s5 i$ u8 Q! C4 V+ ]' @
        int fd;/ \" Z1 ~; g  H
        int *mem = NULL;
- S$ }1 }/ n0 [9 m) f2 D; X! b2 H3 p1 ^' l
        if((fd = open("/dev/mem", O_RDWR)) <0)
! ^  Y) [9 _# ^/ {9 Y- \        {
" H! M2 x/ [9 Q, b( E9 ^                perror("open error");, I2 |" b! l0 L) V& {
                return -1;7 A& G1 \* z# C& J% ~
        }  R' _2 B+ V6 Y. A
        
0 L) A0 O: A6 o) n4 G3 |2 `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ J* `2 i4 d4 f! F( w9 J6 Q1 B6 Q
        while(1)
! L  f: Q% b" }  |% b        {
0 t% E$ I  z4 H- K+ o& J- o1 v                read_MSG_buffer(mem);& Y0 F1 Q" X" K* e( v4 V
        }                * y0 }7 ?3 p  F% c  x( w/ Z
}
; E. c7 O1 p8 s
- S  _9 _+ }, {2 uvoid read_MSG_buffer(int *baseaddr)
$ r5 ]: I" K0 R$ H$ z# I6 h{
8 Z4 s  a- q; M. V! J" V* ?        pRX_MSG_PROTOCOL pshreRAM = NULL;5 o; C, ~) _2 B
5 S% P1 E" x& J/ R$ G6 X- ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 o( r: ^5 P8 @: v
5 |( N* w1 _+ X. `* |. X5 b        if(pshreRAM->packet_cout != count_copy)
; d/ u9 r% Y1 b8 {) D        {
9 M# }' e' k2 Z3 z9 o8 `                printf("a is %d\n", pshreRAM->a);
1 Y+ m+ h% @( }6 r3 b5 i' k8 E' K0 ]                printf("b is %d\n", pshreRAM->b);# `3 @6 k" p' S- y+ _- t( X3 K, @
                printf("count is %d\n", pshreRAM->packet_cout);
1 T) t/ A( g  I) h. v5 O                count_copy = pshreRAM->packet_cout;5 t% S2 W$ q, v& r) p
        }5 ~3 o& z/ c  s( {7 W) |
        else6 m# S! l. _- z" r9 G
        {
: C0 X2 B& c! _& w: J                printf("No effective message!\n");
; R8 G" N8 z- \" d+ p7 P7 [        }
. Y0 y" v0 @0 G4 r6 O& ~, X1 D}
" }( d  h+ \8 i. N) A
) i" d7 U7 M$ N4 a# n没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 ~1 J9 W& G9 W3 b7 \( A* i9 F
1 G4 t5 p8 h5 S3 `% O6 \9 \% m* z! s8 s* k3 \" `

) g0 b, J8 g2 s: ?3 p( @8 Q
0 u: |6 S+ N6 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 22:32 , Processed in 0.037423 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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